這個問題很容易用代碼解釋。
我撰寫了幾個模板類,它們派生自一個獨特的模板類:
template<typename T,unsigned N>
struct DElem :
public BElem<T>
{};
當我必須從基類的容器中撰寫這些前派生型別的容器時,我的問題就出現了:
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*
};
有人有一個想法可以更輕松地完成這些任務,或者其他一些更合適的設計?
uj5u.com熱心網友回復:
你運氣不好。的容器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>
不允許廢話的所有 s 的共享基類。
或者,如果您不需要運行時多型性,您可以只定義一個concept
for BContainer
。使用前概念容器要求作為基礎:
template<container C, typename T>
concept BContainer = std::derived_from<typename C::value_type, BElem<T>>;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467060.html