gpt4 book ai didi

c++ - 添加不同类型的数组 (c++)

转载 作者:行者123 更新时间:2023-11-28 06:56:05 24 4
gpt4 key购买 nike

我需要动态创建包含不同数值类型的数组,包括 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;

感谢您的任何建议。

最佳答案

好吧,从我对该线程中所有内容的评论来看,这可能是我特别痛的地方。这是有充分理由的,我曾经和你一样。我当时想,我可以重载运算符!惊人的!使所有运算符(operator)过载(这是使用自定义图像容器类型)。过了一会儿,一些事情变得清楚了:

  1. 操作符很难正确声明,尤其是模板化操作符。
  2. 模板化运算符不能显式设置其类型,只能隐式设置。
  3. 操作顺序始终没有意义。
  4. 运算符(operator)必须使用异常作为“失败”模式,这在所有情况下都不是理想的,或者如果可以在编译时检测到失败,则使用“enable-if”类型的语法。
  5. 运算符的含义很难记录/阐明。对运算符(operator)应该“做什么”的不同解释让人很难弄清楚。 (MyArray<T>+MyArray<J> 应该像 T+J 一样作为成员加号工作,还是应该像“字符串 + 字符串”这样的连接一样工作?)
  6. 运算符必须按值返回,如果您的移动设置不正确/您不在 C++11 中/出于任何原因返回值省略不会发生,这可能会导致开销。
  7. 总的来说,编写自己的容器类型是重做 STL 已经完成的大量工作的好方法。

你可以这样做(在命名空间范围内)(假设你有一个可用的模板化转换运算符)

template <typename T, typename J>
MyArray<decltype(T()+J())> operator+(const MyArray<T>& x,const MyArray<J>& y)
{
using K=decltype(T()+J());
MyArray<K> ret(x.size());//or something?
for (size_t i = 0; i < x.size(); i++) {ret[i]=x[i]+y[i];}//could replace with foreach
return ret;
};

尽管将以下内容与 vector 一起使用更有意义。如果需要,您可以将其包装在“添加”调用中。

std::vector<T> a;//or whatever
std::vector<J> b;//or whatever
std::vector<K> c(a.size());//note: you can still use the decl type here, OR just define it to whatever you actually want it to be
std::transform(a.begin(), a.end(). b.begin(), c.begin(), std::plus<K>());

如果你想在所有地方都这样做,并试图制作一个矩阵数学库,使用像 Eigen 这样的库,它会为你节省很多工作,它会被强类型化为一个矩阵,并且不是通用集合,它将使用 Eigen 团队拥有的全部数学知识来完成。

关于c++ - 添加不同类型的数组 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23155466/

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