Scott Meyers发布了他的下一本书EC ++ 11的内容和状态。他写道,书中的一项可能是“避免std::enable_if
使用函数签名”。
std::enable_if
可用作函数参数,返回类型或类模板或函数模板参数,以有条件地从重载解析中删除函数或类。
在此问题中,显示了所有三种解决方案。
作为功能参数:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
作为模板参数:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
作为返回类型:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- 应该首选哪种解决方案,为什么我应该避免其他解决方案?
- 在哪些情况下,“避免
std::enable_if
使用函数签名”与返回类型的使用有关(这不是正常函数签名的一部分,而是模板专业化的一部分)? - 成员函数模板和非成员函数模板有什么区别吗?
std::enable_if
使我的函数签名混乱(尤其是丑陋的附加nullptr
函数参数版本),因为它看起来总是像是一个奇怪的hack(对于某种static if
可能做得更漂亮,更干净)使用black-magic模板来开发有趣的语言功能。这就是为什么我更喜欢标签分发的原因(嗯,您仍然有其他奇怪的参数,但不在公共接口中,而且也不太丑陋和含糊不清)。
=0
的typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
完成?我找不到正确的资源来理解它。我所知道的第一部分之前=0
有一个成员类型int
,如果U
和int
是一样的。非常感谢!