确定与std :: function <r(t1,t2)>?</r(t1,t2)兼容的函数类型集的规则>

时间:2011-11-28 15:12:13

标签: c++ templates c++11 implicit-conversion type-erasure

假设我有这个,

std::function<int(int,int)> fs;

然后如何确定fs可以初始化的函数集(或函数对象)?

以下哪项是允许的,哪些不允许:

std::function<int(int,int)> fs = [](int, int) { return int(10); };
std::function<int(int,int)> fs = [](char, char) { return char(10); };
std::function<int(int,int)> fs = [](int, short) { return int(10); };
std::function<int(int,int)> fs = [](double, int) { return float(10); };
std::function<int(int,int)> fs = [](int, wchar_t) { return wchar_t(10); };

std::function<int(int,int)> fs = [](const char*, int){ return "string"; };
std::function<int(int,int)> fs = [](const char*, int){ return 10; };
std::function<int(int,int)> fs = [](const char*, int){ return std::string(); };

当然,我可以编译并查看哪个编译好,哪个不编译。但这并不能帮助我理解参数类型和返回类型的变化。我可以在多长时间内使用不同的类型?

换句话说,如果我给出了一个函数(或函数对象),如何在编译时确定它是否与std::function<int(int,int)>兼容?我很少理解,但我不够自信。

那么请帮助我理解并制定确定与std::function<R(T1,T2)>兼容的功能类型集的规则? metaprogramming可以帮助我在这里通知用户,如果他们使用不兼容的函数会产生很好的错误消息吗?

顺便说一句,第一组似乎兼容:http://ideone.com/hJpG3

1 个答案:

答案 0 :(得分:4)

对象(函数指针或函子)必须可以使用给定的参数类型进行调用,即fun( declval< Types >() ... )格式正确并可隐式转换为R

特别参见C ++11§20.8.2;它为指向成员的指针等提供了各种特殊情况.§20.8.11.2/ 2和20.8.11.2.1 / 7将此绑定到std::function构造函数。