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
};
您可能想隐藏(或 delete
)BElem<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>>;
这个问题用代码很容易解释。
我编写了几个模板 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
};
您可能想隐藏(或 delete
)BElem<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>>;