在C ++ 11中,您可以像这样实例化std :: function:
std::function<void(int)> f1;
std::function<int(std::string, std::string)> f2;
//and so on
但是虽然网上有大量关于可变参数模板的信息,但我找不到任何关于如何编写std :: function-like模板的文章,这些模板会接受带括号的参数。 任何人都可以解释一下语法及其局限性,或者至少指出现有的解释吗?
答案 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>