A sınıfı X içeremez mantıksal olarak hariç, X sınıfının gerçek örneklerinin birden çok kopyası.
bir biz
struct X {
std::array<X, 2> data;
};
X
için mümkündür boyutu sonsuz varsa sizeof(X)
= 2*sizeof(X)
ve sizeof(X)>=1
sahip C++ tüm türleri.
C++, sonsuz büyüklükteki türleri desteklemez.
İkinci probleminiz, tip örneklerinin şablon olmamasıdır.
template<typename T, template<typename> class Tuple>
class tree
bu tip T
ve template
Tuple
sürer. İkinci argüman , tipinde değildir.
template<typename T, std::size_t N>
using static_tree = tree<T, std::array<T, N>>;
burada, ikinci argüman tip değil, bir şablondur.
template<std::size_t N>
struct array_of_size {
template<class T>
using result=std::array<T,N>;
};
template<typename T, std::size_t N>
using static_tree = tree<T, array_of_size<N>::template result>;
, yukarıdaki "sonsuz büyüklük sorunu" dışında, sorunu çözmek olacaktır. Burada array_of_size<N>::result
şablonunu tree
'a geçiriyoruz.
Sonsuz boyut problemini çözmek için, dizisinde mağaza işaretleyicileri (veya eşdeğer bir şey) gerekir.
template<std::size_t N>
struct array_of_ups_of_size {
template<class T>
using result=std::array<std::unique_ptr<T>,N>;
};
template<typename T, std::size_t N>
using static_tree = tree<T, array_of_ups_of_size<N>::template result>;
ve şimdi static_tree benzer static_tree
bir unique_ptr
her biri N
çocuğu vardır: Yani biz olsun.
Bu hala çalışmıyor, çünkü yıkıcı sorunları nedeniyle.
template<typename T, template<typename> class Tuple>
class tree
{
private:
T m_value;
Tuple<tree> m_children;
public:
~tree();
};
template<typename T, template<typename> class Tuple>
tree<T,Tuple>::~tree() = default;
Ben görünse de yukarıdaki düzeltmeleri tuhaf, düşünüyorum.
Temel olarak, alt dizi yaptığınızda, ağaç türü eksik. Imhada, silme denir. Bu noktada ağaç tamamlanmış olmalı. Dergiyi erteleyerek, umarım sorunla ilgileniriz.
Bu teknik şablonlar için gerekli olup olmadığı belirsiz, ancak şablon olmayan sınıflar içindir.
sahibi 'tree', neden Tuple' bir tür parametresi yerine bir şablon' yapmaz parametre? –
@AlanStokes Bu durumda static_tree'yi nasıl tanımlarım? Bu sonsuz bir keşif olurdu, değil mi? – 0xbadf00d
Gerçek şu ki, std :: array' bir tamsayı parametresine ihtiyaç duyar. Bunu belirtmenin bir yolu yok * bir yerlerde *. Bunun olduğu yerde birçok alternatif var ve seninki açıktan çok uzak değil. – davidhigh