gpt4 book ai didi

c++ - 可以将c++运算符的功能名称制作为模板吗?

转载 作者:行者123 更新时间:2023-12-02 09:52:33 25 4
gpt4 key购买 nike

我想为值 vector 构造 bool(boolean) 运算符;像operator<operator<=operator==
这样一来,我可以拥有std::vector<double> values;并将所有值与某物进行比较:

std::vector<bool> valuesLessThanZero = values < 0.0;
我可以使用 #define做到这一点,例如:
#define BOOL_ARRAY_OPER(OP)                                                   \
template <typename T> \
std::vector<bool> operator OP (const std::vector<T>& vec, const T& value) { \
std::vector<bool> results; \
results.reserve(vec.size()); \
for (const T& result : vec) { \
results.push_back(result OP value); \
} \
return results; \
}

BOOL_ARRAY_OPER(<)
BOOL_ARRAY_OPER(<=)
BOOL_ARRAY_OPER(>)
BOOL_ARRAY_OPER(>=)
BOOL_ARRAY_OPER(==)
BOOL_ARRAY_OPER(!=)
示例代码 here
我想知道是否有一种方法可以完全使用模板来执行此操作,而不必对我希望使用的每个运算符进行 BOOL_ARRAY_OPER()编码?
如果我将其编写为:
template <typename T, typename OP>
std::vector<bool> operator OP (const std::vector<T>& vec, const T& value) { ... }
出现以下错误:
main.cpp:22:19: error: conversion function must be a non-static member function
std::vector<bool> operator OP (const std::vector<T>& vec, const T& value) {
^

最佳答案

通常的c++方式将类似于以下转换:

std::vector<double> values;
...
std::vector<bool> valuesLessThanZero;
std::transform(values.cbegin(), values.cend(), std::back_inserter(valuesLessThanZero), [] (double value) { return value < 0; });
当然,有可能写
std::vector<bool> operator<(std::vector<double> const & values, double value) { ... }
那会产生类似的结果,但我建议您认真考虑一下,以您认为的方式滥用语法是否真的会带来任何好处。大多数人希望“值<0”会产生一个 bool(boolean) 值,而不是这些值的 vector 。另外,当然您还需要提供
std::vector<bool> operator <(bool value, std::vector<double> const & values) { ... }
如果您想允许使用通常与顺序无关的语义,那么如果您要生产所有六个比较运算符,并且如果需要处理r值引用个案时,它就会迅速膨胀。

关于c++ - 可以将c++运算符的功能名称制作为模板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63306996/

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