假设我有这个,
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
答案 0 :(得分:4)
对象(函数指针或函子)必须可以使用给定的参数类型进行调用,即fun( declval< Types >() ... )
格式正确并可隐式转换为R
。
特别参见C ++11§20.8.2;它为指向成员的指针等提供了各种特殊情况.§20.8.11.2/ 2和20.8.11.2.1 / 7将此绑定到std::function
构造函数。