我的目的是在模板里声明一个可重载的函数,用enable_if,根据函数的返回值。
如果是void就是某个函数体,否则是另一个。
我的思考是用result_of获取函数返回类型,多半是在用法上的问题吧,或者难道是VS不支持?
难道返回类型与void比较,用is_same,再用enable_if使这个重载生效或失效。
下面代码没有重载部分,只是演示为什么result_of,总是失败,直接用目标类就可以,把模板参数套入result_of就失败。
using namespace std; struct foo { int func(int) { return 1; } }; template<typename T> struct wrapper { template<typename F> struct callable { F func; callable(F func) :func(func) {} enable_if<is_same<decltype((new foo()->*&foo::func)(0)), int>::value, int>::type value; //enable_if<is_same<decltype(&foo::func)(foo,int), int>::value, int>::type value2; //enable_if<is_same<decltype((new T()->*func(0))), int>::value, int>::type value3; //typedef result_of<F(T, int)>::type rtype; }; }; int main() { typedef result_of<decltype(&foo::func)(foo, int)>::type functype; enable_if<is_same<functype, int>::value, int>::type value2 = 100; wrapper<foo>::callable<decltype(&foo::func)> call(&foo::func); return 0; }