如何引用带有跨度的向量<Derived><Base>

问题描述 投票:0回答:1

所以我的问题很简单。我有

std::vector<Derived>
,并且很自然地希望拥有
std::span<Base>
Derive
继承自
Base
:

#include <span>
#include <vector>

class Base {};
class Derived : public Base {};

int main 
{
    std::vector<Derived> vec {Derived{}, Derived{}};
    // std::span<Base> span = ???;
    return 0; 
}

我想这是不可能的。有什么通用的解决方法吗?如果是的话,有什么限制吗?

我被困住了。我看没有解决办法

c++ inheritance vector reference std-span
1个回答
0
投票

当您想要拥有派生对象的基本视图时,您几乎会陷入必须通过指针或引用来完成此操作的事实。

因此,您可以创建类似

std::array<Base *, size>
的东西,或者可能是
std::array<wrapper<Base>, size>
(其中
wrapper
充当引用而不是指针,因此您不需要显式取消引用它 - 也许
std::reference_wrapper
,或者也许是其他东西)。

如果您不介意自己做更多工作,您可以很容易地创建一个类似于

std::span
的类,它仅存储指向第一项(或可能指向底层集合)的指针以及计数,并且支持索引运算符以返回对集合中对象的引用:

template <class Derived, class Base>
class ref_span {
    Derived *begin;
    size_t size;
public:
    ref_span(Derived *begin, size_t size)
        : begin(begin), size(size) {}

    Base &operator[](size_t index) {
        if (index >= size)
            throw std::out_of_range("Index out of range");
        return begin[index];
    }
};

生活在Godbolt

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.