std :: function作为模板模板参数

时间:2017-09-25 09:50:02

标签: c++ templates

受到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());
   };
};

1 个答案:

答案 0 :(得分:3)

您部分专业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()>
      );
};