C++17 中的折叠表达式 - 比较运算符的用例
Folding expressions in C++17 - Usecase for comparison operators
根据 N4295 C++17 将允许我计算未知数量参数的总和:
template<typename ... T>
int sum(T...t)
{
return (... + t);
}
文档进一步指出我可以使用 == 或 > 等运算符来代替 +。任何人都可以想出一个合理的例子来说明我什么时候想在这样的结构中使用 == 或 > 吗?
(我知道人们可以定义 == 和 > 来对奇怪的 类 做奇怪的事情,但这肯定违反了良好的做法。写 a > b > c > d
几乎不是一个好主意,是吗?)
如果像 Python 中那样处理链式比较,我将是一个有趣的功能,其中 a < b < c
被解释为 a < b and b < c
,并且对 b
进行单次评估。不幸的是,在 C++ 中情况并非如此,甚至在奇怪的情况下,折叠比较运算符确实几乎没有意义。
请注意,a proposal (P0313) 实际上删除了运算符 ==
、!=
、<
、>
、<=
和 >=
来自完全由折叠表达式处理的运算符。 2016 年 6 月在奥卢举行的委员会会议上对此进行了讨论。删除的动机相当简短:
Comparison operators don't make much sense in fold-expressions; they expand into expressions that have surprising effects, and are thus useful for dsl-metaprogrammers only. [...] It would be nice to be able to fix expressions like a < b < c
. That would require a time machine. Not repeating the problem for fold-expressions seems doable.
那表示提案被拒绝了。
在用例上是 expression templates,比较运算符(例如 operator ==
)return 是 class 对象而不是 bool
。
虽然在这里我也很难想出一个有用的例子。
这不是 "direct folding of == alone",而是“&& 与包含 == 的表达式折叠。然而,这是我用来比较值的解决方案,也许这也是您想到的那种应用程序。
这适用于我,适用于 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)
时警告您,因为在这种情况下,函数 returns && 运算符的中性值(即 true
).
根据 N4295 C++17 将允许我计算未知数量参数的总和:
template<typename ... T>
int sum(T...t)
{
return (... + t);
}
文档进一步指出我可以使用 == 或 > 等运算符来代替 +。任何人都可以想出一个合理的例子来说明我什么时候想在这样的结构中使用 == 或 > 吗?
(我知道人们可以定义 == 和 > 来对奇怪的 类 做奇怪的事情,但这肯定违反了良好的做法。写 a > b > c > d
几乎不是一个好主意,是吗?)
如果像 Python 中那样处理链式比较,我将是一个有趣的功能,其中 a < b < c
被解释为 a < b and b < c
,并且对 b
进行单次评估。不幸的是,在 C++ 中情况并非如此,甚至在奇怪的情况下,折叠比较运算符确实几乎没有意义。
请注意,a proposal (P0313) 实际上删除了运算符 ==
、!=
、<
、>
、<=
和 >=
来自完全由折叠表达式处理的运算符。 2016 年 6 月在奥卢举行的委员会会议上对此进行了讨论。删除的动机相当简短:
Comparison operators don't make much sense in fold-expressions; they expand into expressions that have surprising effects, and are thus useful for dsl-metaprogrammers only. [...] It would be nice to be able to fix expressions like
a < b < c
. That would require a time machine. Not repeating the problem for fold-expressions seems doable.
那表示提案被拒绝了。
在用例上是 expression templates,比较运算符(例如 operator ==
)return 是 class 对象而不是 bool
。
虽然在这里我也很难想出一个有用的例子。
这不是 "direct folding of == alone",而是“&& 与包含 == 的表达式折叠。然而,这是我用来比较值的解决方案,也许这也是您想到的那种应用程序。
这适用于我,适用于 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)
时警告您,因为在这种情况下,函数 returns && 运算符的中性值(即 true
).