【发布时间】:2014-06-03 01:01:24
【问题描述】:
我需要动态创建包含不同数值类型的数组,包括 char、int、unsigned int、float、double。我希望能够创建这些数组中的任意两个,并假设它们的长度相同,实现算术运算符,例如 operator+=
我已经能够将数组实现为模板,但我不知道如何实现任何算术运算符,因为在编译时我不知道其他数组的类型是什么,甚至当第一个数组被创建(我会知道我正在构建的数组的类型)。我查看了 std::array,但它不支持算术运算符。另一种绝对不优雅(但确实有效)的替代方法是实现一系列特定于类型的运算符,例如
MyArray<V> operator+ (const MyArray<float>& addend) const;
MyArray<V> operator+ (const MyArray<double>& addend) const;
MyArray<V> operator+ (const MyArray<int32>& addend) const;
MyArray<V> operator+ (const MyArray<int16>& addend) const;
感谢您的建议。
【问题讨论】:
-
这些运营商需要做什么?如果它们是简单的算术,那你为什么要自己写呢?
-
这可能是运算符重载不是一个好选择的实例,恕我直言。
std::transform(this->begin(), this->end(), addend.end(), output->begin(), std::plus<V>()); -
为了展开,二元运算符重载只有在你能保证它们有意义时才有意义。这从表面上看似乎很简单,但您需要保证
a+b==b+a之类的东西,而您的情况显然没有(返回类型不同意)。此外,您似乎正在为每个运算符分配一个新数组,这将产生不必要的开销。 -
@MadScienceDreams 这并不总是正确的。例如对于矩阵类,二元运算符 * 会根据输入的顺序给出不同的答案。
-
@CoffeeandCode 是的,我同意我不够清楚。另一个例子,其中操作顺序对连接类型“加号”很重要。最大的问题是,无论做什么,它必须有意义,这不是微不足道的。对于数学加法运算符,
a+b应该等于b+a。