假设我正在尝试实现一些数学向量类。
由于向量接口将在多个地方使用:基于数组的向量,矩阵返回列和行作为向量接口对象等。
我想为我的向量重载 +,- 运算符。每个运算符都应返回某个向量实现类的新构造对象。
但正如您所知,运算符重载应该返回一个值或一个引用。我无法返回值,因为我需要运行时多态性,所以我留下了引用。但是要有一个在函数调用对象之后不会死掉的引用应该在堆中创建。
那么我应该如何处理这种情况呢?
PS 我可以创建一个 shared_ptr 并返回对包含值的引用,但这看起来不是一个好习惯。
typedef unsigned int vector_idx_t;
template <class T, vector_idx_t size>
class vector {
public:
virtual ~vector();
virtual T& operator[](const vector_idx_t idx) = 0;
virtual vector<T, size>& operator+ (const T& a) const = 0;
virtual vector<T, size>& operator- (const T& a) const = 0;
virtual vector<T, size>& operator* (const T& a) const = 0;
virtual vector<T, size>& operator/ (const T& a) const = 0;
virtual vector<T, size>& operator+ (const vector<T, size>& vec2) const = 0;
virtual vector<T, size>& operator- (const vector<T, size>& vec2) const = 0;
};
template <class T, vector_idx_t size>
class array_vector: public vector<T, size> {
private:
std::array<T, size> m_elements;
public:
array_vector();
array_vector(std::array<T, size> elements);
array_vector(const vector<T, size>& vec2);
array_vector(std::initializer_list<T> elems);
virtual ~array_vector();
virtual T& operator[](const vector_idx_t idx) {
return m_elements[idx];
}
virtual vector<T, size>& operator+ (const T& a) const {
std::array<T, size> e;
for (vector_idx_t i = 0; i < size; ++i) {
e[i] = m_elements[i] + a;
}
auto v = std::make_shared<array_vector<T, size>>(elems);
return *v;
}
};