C ++ std :: function-like模板语法

时间:2014-12-22 13:56:34

标签: templates c++11 syntax variadic-templates std-function

在C ++ 11中,您可以像这样实例化std :: function:

std::function<void(int)> f1;
std::function<int(std::string, std::string)> f2;
//and so on

但是虽然网上有大量关于可变参数模板的信息,但我找不到任何关于如何编写std :: function-like模板的文章,这些模板会接受带括号的参数。 任何人都可以解释一下语法及其局限性,或者至少指出现有的解释吗?

2 个答案:

答案 0 :(得分:15)

没有什么特别之处,它是一种普通的功能类型。声明如下函数时:

int foo(char a, double b)

然后它的类型是int (char, double)。 “展开”各个参数类型和返回类型的一种方法是使用部分模板特化。基本上,std::function看起来像这样:

template <class T>
struct function; // not defined

template <class R, class... A>
struct function<R (A...)>
{
  // definition here
};

答案 1 :(得分:3)

与其他模板非常相似,因为int(std::string, std::string)只是一种类型。

这是一个非常天真的例子:

template <typename FType>
struct Functor
{
   Functor(FType* fptr) : fptr(fptr) {}

   template <typename ...Args>
   void call(Args... args)
   {
      fptr(args...);
   }

private:
   FType* fptr;
};

void foo(int x, char y, bool z) {}

int main()
{
   Functor<void(int, char, bool)> f(&foo);
   f.call(1, 'a', true);
   //f.call(); // error: too few arguments to function
}

实际上,您在FType ReturnType(ArgTypes...)上有专业化,但是如果您尝试以兼容的方式调用它,我的天真示例已经为您提供了所需的验证。< / p>