这不是“单独的 == 的直接折叠”,而是“&& 与涉及 == 的表达式折叠。然而,这是我用来比较值的解决方案,也许这也是您想到的那种应用程序。
这对我有用,对于 g++ 和 clang++
template <typename TYPE, typename... TYPE_TAIL>
constexpr bool same_value([[maybe_unused]] TYPE value, TYPE_TAIL... value_tail)
{
return (... && (value == value_tail));
}
static_assert(same_value(3));
static_assert(same_value(3, 3));
static_assert(!same_value(3, 1));
static_assert(same_value(3, 3, 3));
static_assert(!same_value(3, 1, 3));
int main() {}
汇编:
clang++ -std=c++1z testFold.cpp -o testFold
(版本:clang 版本 5.0.0-+rc2-1 (tags/RELEASE_500/rc2))
或者
g++ -std=c++17 testFold.cpp -o testFold
(版本:g++(Debian 7.2.0-8)7.2.0)
[[maybe_unused]]
防止编译器在仅使用一个参数调用时发出警告,因为same_value(one_arg)
在这种情况下,函数返回 && 运算符的中性值(即true
)。