我对c ++还是很陌生,我尝试使用模板在c ++ 17中创建一个Array类。在此类中,我以使它可以添加多种类型的数组的方式重载了+运算符。到目前为止,它确实有效,我能够添加不同的数组,例如float和int类型一起。但是,我在如何定义新数组的类型时遇到了麻烦,这是添加的结果。
假设我添加的数组是float和int类型。然后,新数组也应为float。但是,就我而言,我不知道哪个数组具有浮点类型,第一个或第二个,因此我无法创建类型为T或U的新数组。
此外,如果由于巧合,两个float数组加在一起仅是int值(例如1.5 + 3.5 = 5(int)),则新数组应为int类型。
基本上,我尝试根据添加后内容的类型来定义新数组的类型。
我遇到了一些包含decltype的解决方案。但是,由于数组具有多个值,因此我无法设法找到如何将其包含在多个值中的方法。在我当前的代码中,我基于类型T创建新数组。但是,如果在某种情况下T为int类型,U为float类型,则结果不正确。
任何建议或技巧都将不胜感激。 预先感谢,
template <typename T>
class Array {
public:
T* content;
int length;
// Default Constructor
Array() : content(nullptr), length(0) {}
// Constructor when length is provided
Array(int length) : content(new T[length]), length(length) {}
// Constructor (using initializer list)
Array(std::initializer_list<T> list) : Array((int)list.size()) {
std::uninitialized_copy(list.begin(), list.end(), content);
}
// Obtain content at index i
float& operator[](int i) { return content[i]; }
// Adding arrays
template <typename U>
Array& operator+(Array<U>& other) {
Array<T>* new_array = new Array(other.length);
for (auto i = 0; i < other.length; i++)
new_array->content[i] = this->content[i] + other.content[i];
return *new_array;
}
};
答案 0 :(得分:1)
使用decltype
,您的operator +
可能如下所示:
template<typename U>
auto operator+(const Array<U>& rhs)
-> Array<std::decay_t<decltype((*this)[0] + rhs[0])>>
{
Array<std::decay_t<decltype((*this)[0] + rhs[0])>> res(rhs.length);
for (auto i = 0; i != rhs.length; i++) {
res[i] = (*this)[i] + rhs[i];
}
return res;
}