为什么没有 boost::enable_if 的标准等价物?

Why is there no std equivalent of boost::enable_if?

在 C++11 中,std::enable_if 被添加到标准库中。等价于条件为boolboost::enable_if_c。这适用于相当简单的条件,但是一旦您使用将结果保存在 value 常量中的谓词,您就必须使用更冗长的结构 my_predicate<MyArgs>::value 将其转换为 bool . 这正是 boost::enable_if(没有 _c 后缀)的目的。

为什么标准库中没有等效项?

标准库在这里走了一条不同的路。 C++17 为 return a ::value 的所有类型特征添加了变量模板快捷方式。模式总是

template <typename... Args>
some_trait_v = some_trait<Args...>::value;

例如你可以写

std::enable_if<std::is_same_v<T1,T2>>

此外 enable_if 的参数可以是 constexpr 表达式的结果,例如

std::enable_if<some_constexpr_function<T1,T2>()>

这种方式更通用,不依赖于传递必须具有 value 成员的内容。