Scott Meyers 即将出版的书 EC 11 建议避免在函数签名中使用 std::enable_if。尽管它在有条件地从重载解析中删除函数或类方面具有多功能性,但某些限制和可读性问题值得重新考虑其用法。
函数参数:
<code class="cpp">template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< // Option 1: As function parameter std::is_same<U, int>::value >::type* = 0) { return 42; } };</code>
模板参数:
<code class="cpp">template<typename T> struct Check2 { template<typename U = T, typename std::enable_if< // Option 2: As template parameter std::is_same<U, int>::value, int >::type = 0> U read() { return 42; } };</code>
返回类型:
<code class="cpp">template<typename T> struct Check3 { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value, U>::type read() { // Option 3: As return type return 42; } };</code>
最佳解决方案是将enable_if放置在模板参数中。这种方法有几个优点:
可读性增强:
enable_if 的使用与返回/参数类型分开,提高了清晰度并减少了混乱。
通用适用性:
与其他选项不同,模板参数放置适用于没有附加参数的构造函数和运算符。
返回类型排除:
虽然“避免函数签名中的 std::enable_if”主要解决其在普通函数签名中的使用,它确实适用于模板专业化中的返回类型。这个问题源于将enable_if与返回类型合并时的可读性问题。
成员函数与非成员函数:
该原则对于成员函数模板和非成员函数模板都适用。
以上是您应该在函数签名中避免使用“std::enable_if”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!