为什么应该在函数签名中避免 std::enable_if?
std::enable_if 是条件模板元编程的强大工具,但是它在函数签名中的滥用可能会导致各种陷阱。本文探讨了为什么通常应该避免在函数签名中使用 std::enable_if 并提供替代方法。
函数参数启用
当用作函数参数时,std ::enable_if 可能会使函数签名与复杂的类型名表达式变得混乱。这会降低可读性并使代码更难以维护。例如:
<code class="cpp">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; } };</code>
模板参数启用
推荐的方法是将 std::enable_if 放在模板参数中:
<code class="cpp">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; } };</code>
这种方法通过将模板参数与返回/参数类型分开来增强可读性。它还提供了普遍适用性,因为构造函数和某些运算符不能有额外的参数或返回类型。
返回类型启用
使用 std::enable_if 作为返回类型是不是典型函数签名的一部分。然而,它可能会产生误导,通常应该避免。
会员与非会员模板
本文中提到的问题同样适用于会员和非会员-成员函数模板。
以上是为什么应该在函数签名中避免使用'std::enable_if”?的详细内容。更多信息请关注PHP中文网其他相关文章!