gpt4 book ai didi

c++ - std::function 作为模板模板参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:06 24 4
gpt4 key购买 nike

受到 this blog 的启发,我想我会尝试用 C++ 创建一个通用的 Functor 类。我不太出去。我用它作为正确理解模板的借口,而不仅仅是涉猎。

#include <functional>

template<template <typename> typename F_, typename A>
struct Functor {

template<typename B>
static F_<B> fmap
( std::function<B(A)>
, F_<A>
);

};


template<typename A>
struct Functor<std::function, A(void)> {};

template<typename A>
template<typename B>
std::function<B()> Functor<std::function, A(void)>::fmap
( std::function<B(A)> f
, std::function<A()> fA
){
return [&](){
return f (fA());
};
};

经过一番折腾,我被难住了。我有编译器错误

error: no ‘std::function<B()> Functor<std::function, A()>::fmap(std::function<B(A)>, std::function<A()>)’ member function declared in class ‘Functor<std::function, A()>’

我迷路了。坦率地说,我以为我已经宣布了这一点。有什么建议么?我正在使用最新的编译器 gcc 7.2 使用 C++17 进行编译。不过,我认为 C++14 已经足够了。

顺便说一句,我可以很高兴地编译一个非通用版本的 fmap

template<typename A, typename B>
std::function<B(void)> fmap1
( std::function<B(A)> f
, std::function<A(void)> fA
)
{
return [&](){
return f (fA());
};
};

最佳答案

您部分特化了 Functor。没关系,但是您的特化没有声明任何成员。具体来说,没有 fmap 成员。回想一下,特化不会自动从主模板中获取任何内容。

所以只需添加声明:

template<typename A>
struct Functor<std::function, A(void)>
{
template<typename B>
static std::function<B()> fmap
( std::function<B(A)>
, std::function<A()>
);
};

关于c++ - std::function 作为模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46402256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com