Klasa X nie może zawierać wiele kopii rzeczywistych wystąpień klasy X, z wyjątkiem logicznego.
if mamy
struct X {
std::array<X, 2> data;
};
jedyny możliwy rozmiar X
nieskończoność, a sizeof(X)
= 2*sizeof(X)
i wszystkie typy C++ mają sizeof(X)>=1
.
C++ nie obsługuje nieskończenie dużych typów.
Twój drugi problem polega na tym, że instancje typu nie są szablonami.
template<typename T, template<typename> class Tuple>
class tree
trwa to typ T
i template
Tuple
. Drugi argument nie jest typem.
template<typename T, std::size_t N>
using static_tree = tree<T, std::array<T, N>>;
tutaj, twój drugi argument jest rodzajem, nie jest szablon.
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>;
, inny niż powyższy "problem z nieskończonym rozmiarem", rozwiązać problem. Tutaj mijamy szablon array_of_size<N>::result
do tree
.
Aby rozwiązać problem z nieskończonym rozmiarem, musisz musi przechowywać wskaźniki (lub coś podobnego) w tablicy. Tak więc otrzymujemy:
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>;
a teraz swoją static_tree ma N
dzieci, z których każda stanowi unique_ptr
do podobnego static_tree
.
To nadal nie działa, z powodu problemów z destruktorem.
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;
Myślę, że powyższe rozwiązuje, dziwne, jak może się wydawać.
Zasadniczo, po utworzeniu tablicy dzieci, typ drzewa jest niekompletny. Podczas destrukcji wywoływane jest usuwanie. W tym momencie drzewo musi być kompletne. Odkładając dtor, mamy nadzieję, że poradzimy sobie z problemem.
Nie jestem pewien, czy ta technika jest wymagana w przypadku szablonów, ale dotyczy klas innych niż szablony.
Jeśli jesteś właścicielem 'tree', dlaczego nie zrobić' Tuple' parametrem typu zamiast szablonu parametr? –
@AlanStokes Jak zdefiniowałabym "static_tree" w takim przypadku? To byłaby niekończąca się rekurencja, prawda? – 0xbadf00d
Faktem jest, że 'std :: array' potrzebuje parametru integer. Nie ma sposobu na określenie go * gdzieś *. Jeśli chodzi o to, gdzie jest to możliwe, istnieje wiele alternatyw, a wasza nie jest daleka od oczywistości. – davidhigh