DElem<T,N> 派生自 BElem<T>,Container<BElem<T,N>> 派生自 Container<BElem<T>> 如何编码?

DElem<T,N> derives from BElem<T> and DContainer<DElem<T,N>> derives from BContainer<BElem<T>> How to code it?

这个问题用代码很容易解释。

我编写了几个模板 classes,它们来自一个独特的模板 class:

template<typename T,unsigned N> 
struct DElem : 
    public BElem<T> 
{};

当我必须从基础容器编写这些前派生类型的容器时,我的问题就出现了 class:

template<typename T, unsigned N>
struct DContainer<DElem<T,N>> : 
    public BContainer<BElem<T>>
{};

在我的具体案例中,Container 可以是 std::tuple 或 std::array。

我的第一个近似值是:

template<typename T, T B, std::size_t N>
struct DContainer : 
    public std::array<BElem<T>,N> 
{

   // This container is to hold **DElem<T,B>**
   // 
   // This class has to do a cast for every
   // 
   // **DElem<T,B>** (that is what the DContainer holds) 
   //
   // to **BElem\<T\>**
   // 
   // *If this task is easy I don't found the way*

};

有人有想法让这些任务更容易完成或其他设计更合适吗?

你运气不好。 DElem<T, N> 容器 不能替代 BElem<T> 容器 。如果可以,下面的废话也允许

DContainer<T, 10> d10Container;
BContainer<T> & bContainer = d10Container;
DElem<T, 20> d20;
bContainer.push_back(d20); // pushed a d20 into a container of d10

您可以拥有 视图BElem<T>

template<typename T>
class BView {
    class iterator {
        using value_type = BElem<T>;
        using reference = BElem<T> &;
        using pointer = BElem<T> *;
        using difference_type = std::ptrdiff_t;
        using iterator_category = std::forward_iterator_tag; // or whatever
        reference operator*();
        pointer operator->();
        // etc...
    };

    virtual iterator begin() = 0;
    virtual iterator end() = 0;

    // no insert / push_back / whatever
};

您可能想隐藏(或 deleteBElem<T> 的赋值运算符,因为多态赋值也相当荒谬。

现在您的所有 DContainer<T, N> 都有一个共享基础 class,不允许胡说八道。

或者,如果您不需要运行时多态性,您可以只为BContainer定义一个concept。使用 pre-concept Container requirements :

template<container C, typename T>
concept BContainer = std::derived_from<typename C::value_type, BElem<T>>;