使用 MS Visual C++ 2012 版本 11.0.51106.01 更新 1:
int x()
{
return 3;
}
template <typename Fun>
typename std::enable_if<std::is_same<Fun, int()>::value, int>::type
MySh(Fun& f)
{
return f();
}
template <typename Fun>
typename std::enable_if<std::is_same<Fun, int()>::value, int>::type
MySh1(Fun&& f)
{
return f();
}
template <typename Fun>
int MySh2(Fun&& f)
{
return f();
}
调用代码:
int res = MySh(x); // compiles and returns 3
res = MySh1(x); // doesn't compile with error: error C2893: Failed to specialize function template 'std::enable_if<std::is_same<Fun,int(void)>::value,int>::type MySh1(Fun &&)
res = MySh2(x); // compiles and returns 3
我还没有尝试使用其他编译器(还),但目的是让它与 Visual C++ 2012 一起使用和/或向 Microsoft 报告编译器错误。
我想确保我不会忽略一些微不足道的事情并犯下愚蠢的错误。当然,示例只是一个摘录,真正的预期用例更复杂并且与以下内容相关: Overloading on callables question
编辑: 我也对其他考虑感到困惑,例如:
std::is_same<decltype(x), int()>::value; // true
std::is_same<decltype(x), int(&)()>::value; //false
和:
template <typename Fun>
typename std::enable_if<std::is_same<Fun, int(&)()>::value, int>::type
MySh1(Fun&& f)
{
std::cout << typeid(f).name() << std::endl; // prints int __cdecl(void)
return f();
}
显然,我没有注意参数类型和参数类型之间的区别(Fun 与 f 和 x 相对)。