首页 >后端开发 >C++ >您应该在函数签名中避免使用'std::enable_if”吗?

您应该在函数签名中避免使用'std::enable_if”吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-31 05:57:30987浏览

Should You Avoid `std::enable_if` in Function Signatures?

程序损伤:避免在函数签名中使用 std::enable_if

Scott Meyers 即将出版的书 EC 11 建议避免在函数签名中使用 std::enable_if。尽管它在有条件地从重载解析中删除函数或类方面具有多功能性,但某些限制和可读性问题值得重新考虑其用法。

在函数签名中使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn