C++操作符函数名可以被模板化吗?

C++操作符函数名可以被模板化吗?,c++,templates,c++17,C++,Templates,C++17,我想为值向量构造布尔运算符;像操作符之类的事情,通常的C++方式都是一种变换: std::vector<double> values; ... std::vector<bool> valuesLessThanZero; std::transform(values.cbegin(), values.cend(), std::back_inserter(valuesLessThanZero), [] (double value) { return value < 0;

我想为值向量构造布尔运算符;像操作符

之类的事情,通常的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”会产生一个布尔值,而不是此类值的向量。当然,你还需要提供

std::vector<bool> operator <(bool value, std::vector<double> const & values) { ... }

如果你想允许通常的顺序不可知语义,如果你想绘制所有六个比较运算符,那么如果你需要处理R值引用的情况,那么这个气球会快速增加。

< P>这样做的通常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”会产生一个布尔值,而不是此类值的向量。当然,你还需要提供

std::vector<bool> operator <(bool value, std::vector<double> const & values) { ... }

如果您想允许通常的顺序不可知语义,如果您想绘制所有六个比较运算符,则需要快速气球,如果需要处理R值引用情况,则需要更多的气球。

< P>不,C++不是D。必须独立声明每个运算符。< /P> 您可以定义一个库,声明所有六个比较运算符,并将它们转发给其他函数,如D中的opBinaryf、x、y,但这仍然需要单独声明所有六个比较运算符,如:

template <typename T>
auto operator==(vector<T> const& v, T const& u) -> vector<bool> {
    return opBinary(std::equal_to{}, v, u);
}

// other 5 here
这可能足以避免在最后具体化向量并直接使用。不幸的是,我们没有很好的分部函数应用程序,不能只写==y或类似的东西,但是如果您写的是做正确事情的短函数对象:

v == x
可能成为

v | views::transform(equals(x))

哪个。。。不是吗?< /P> < P>不,C++不是D。你必须独立声明每个操作符。< /P> 您可以定义一个库,声明所有六个比较运算符,并将它们转发给其他函数,如D中的opBinaryf、x、y,但这仍然需要单独声明所有六个比较运算符,如:

template <typename T>
auto operator==(vector<T> const& v, T const& u) -> vector<bool> {
    return opBinary(std::equal_to{}, v, u);
}

// other 5 here
这可能足以避免在最后具体化向量并直接使用。不幸的是,我们没有很好的分部函数应用程序,不能只写==y或类似的东西,但是如果您写的是做正确事情的短函数对象:

v == x
可能成为

v | views::transform(equals(x))

哪个。。。还不错吗?

要避免布尔数组操作吗?或者干脆完全避免使用宏?你是说push_backvalues小于零,values | filtered[]int v{return vI希望避免使用宏,如果可能的话,因为可能还有另一个操作符我已经忘记了,比如说我有操作符,或者你想避免BOOL_数组操作?还是完全避免使用宏?你是说push_backvalues小于零,值| filtered[]int v{返回vi希望避免宏,如果可能的话,我可能已经忘记了另一个操作符,假设我有一个操作符,它是一个库,它将R语法转换成C++。在R中,IFFER语句像三进制操作:但是在一个数组上:VEC2= IFEVECEC1<100, 0, 100。C++中的VEC1<100是我试图在C++中模仿的。这是一个库,它将R语法转换成C++。在R中,IFFER语句像三元操作一样:但是在一个数组上:VEC2= IFEVECEC1<100, 0, 100。VEC1<100是我在C++中试图模仿的,其中每个元素返回一个布尔值,我可以。在这一点上做进一步的处理。