c++ - 我可以继承 std::array 并重载 operator [] 吗?

这个问题很简单。我正在尝试定义一个自定义数组类,它具有普通 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/

相关文章:

Python - 如何删除以数字开头并包含句点的单词

python - 在代表 python 中大文件的大字符串上加速 re.sub()?

c++ - 如何在始终选择第一个元素并过滤其余元素的范围内创建 View ?

python - 在python中打印出两个列表的组合

rust - Rust 中的一个可变借用或多个不可变借用……为什么?

regex - 为什么 Perl 正则表达式不匹配 "\n"和后面的字符?

bash - 使用 sed 删除算术形式

go - gcloud 函数部署 go 运行时错误 "undefined: unsafe.Slice

c++ - 如何在 SSE2 中为 8 位和 16 位整数实现 vector 右移和左移?

haskell - 我可以在 Haskell 中将数字全局限制为只有 3 位小数吗?