gpt4 book ai didi

C++ 可变参数模板 AND 和 OR

转载 作者:可可西里 更新时间:2023-11-01 18:20:44 26 4
gpt4 key购买 nike

你能用C++11可变参数模板来完成/* ??? */吗?在:

template<bool...v> struct var_and { static bool constexpr value = /* ??? */; };

所以var_and<v...>::value提供 &&在 bool 包上v在编译时?

你能为 struct var_or<v...> 做同样的事情吗?对于 ||

您可以使用短路评估(在两种情况下)吗?

编辑:对the accepted answer的更新添加了 C++17 fold expressions启用

template<bool... v> constexpr bool var_and = (v && ...);
template<bool... v> constexpr bool var_or = (v || ...);

对于基于参数包的方法,似乎只有一种受限类型的“短路评估”是可能的:在实例化 var_or<true,foo(),bar()> 时只打电话 ||一次,它还调用了 foobar .

最佳答案

您不希望 value 成为 typedef。

template<bool head, bool... tail>
struct var_and {
static constexpr bool value = head && var_and<tail...>::value;
};

template<bool b> struct var_and<b> {
static constexpr bool value = b;
};

显然,对于 || 也可以这样做。

短路评估无关紧要,因为它只处理不会有任何副作用的常量表达式。

这是另一种方法,它在发现错误值后立即停止递归生成类型,模拟一种短路:

template<bool head, bool... tail>
struct var_and { static constexpr bool value = false; };

template<bool... tail> struct var_and<true,tail...> {
static constexpr bool value = var_and<tail...>::value;
};

template<> struct var_and<true> {
static constexpr bool value = true;
};

C++17 的更新:使用折叠表达式使这变得更加简单。

template<bool...v> struct var_and {
static constexpr bool value = (v && ...);
};

或者也像 enobayram 建议的那样使用模板变量:

template<bool... b> constexpr bool var_and = (b && ...);

关于C++ 可变参数模板 AND 和 OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11892759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com