这个问题很简单。我正在尝试定义一个自定义数组类,它具有普通 std::array 的所有功能,但我想添加使用 operator [] 和我的代码库中定义的自定义类型的能力。 一种选择是将我的类包装在 std::array 周围,例如:
using MyType = double; // just an example
template<typename T, unsigned Size>
class MyArray
{
private:
std::array<T, Size> m_array{ 0 };
public:
T& operator [](MyType d) { return m_array[abs(round(d))]; }
void print()
{
for (int i : m_array) {
std::cout << i << std::endl;
}
}
};
int main()
{
MyType var = 0.5649;
MyArray<int, 5> vec;
vec[var] = 1;
vec.print();
return 0;
}
输出是
0 1 0 0 0
如预期。这样做的缺点是我无法访问所有其余的典型 std::array 接口(interface)。所以我想为什么不让我的数组继承自 std::array:
using MyType = double; // just an example
template<typename T, unsigned Size>
class MyArray : public std::array<T, Size>
{
public:
// Here I explicitely cast (*this) to std::array, so my operator [] is defined in terms
// of the std::array operator []
T& operator [](MyType var) { return std::array<T, Size>(*this)[abs(round(var))]; }
void print()
{
for (int i : (*this)) {
std::cout << i << std::endl;
}
}
};
int main()
{
MyType var = 2.123;
MyArray<int, 5> vec{ 0 };
vec[var] = 1;
vec.print();
return 0;
}
但在这种情况下输出是
0 0 0 0 0
无论是 value 还是 var,这都意味着 MyArray 没有正常工作。我究竟做错了什么?继承 std::array 时是否存在根本性的错误或不可能?
最佳答案
继承本身是合法的,只要你不去尝试delete
通过指向基类的指针传递派生类,它缺少虚拟析构函数。
问题是 return std::array<T, Size>(*this)[abs(round(var))];
创建临时 std::array
并返回对其元素的引用,该元素立即变为悬空,因为函数返回时临时对象被销毁。
你想要return std::array<T, Size>::operator[](abs(round(var)));
调用operator[]
基类的。或者,您可以执行 static_cast<std::array<T, Size> &>(*this)[abs(round(var))];
.
另请注意,支撑 std::array
当你有嵌套的大括号时,初始化是不稳定的。例如。 std::array<std::pair<int, int>, 2> x = {{1,1},{1,1}};
不起作用,需要一组额外的大括号:std::array<std::pair<int, int>, 2> x = {{{1,1},{1,1}}};
.
但是如果你添加继承,这也会停止工作,你需要又一对花括号。
https://stackoverflow.com/questions/73945190/