Класс X не может содержать несколько копий фактических экземпляров класса X, кроме как логически.
А если у нас есть
struct X {
std::array<X, 2> data;
};
единственный возможный размер для X
— бесконечность, так как sizeof(X)
= 2*sizeof(X)
, а все типы в C++ имеют sizeof(X)>=1
.
C++ не поддерживает бесконечно большие типы.
Ваша вторая проблема заключается в том, что экземпляры типов не являются шаблонами.
template<typename T, template<typename> class Tuple>
class tree
это принимает тип T
и template
Tuple
. Второй аргумент не является типом.
template<typename T, std::size_t N>
using static_tree = tree<T, std::array<T, N>>;
здесь ваш второй аргумент является типом, а не шаблоном.
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>;
решит вашу проблему, кроме вышеупомянутой «проблемы бесконечного размера». Здесь мы передаем шаблон array_of_size<N>::result
в tree
.
Чтобы решить проблему бесконечного размера, вы должны хранить указатели (или что-то подобное) в массиве. Итак, мы получаем:
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>;
и теперь у вашего static_tree есть N
дочерних элементов, каждый из которых является unique_ptr
похожим static_tree
.
Это все еще не работает из-за проблем с деструктором.
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;
Я думаю, вышеизложенное исправляет это, как это ни странно.
По сути, когда вы создаете массив дочерних элементов, тип дерева неполный. При уничтожении вызывается удаление. В этот момент дерево должно быть завершено. Откладывая dtor, мы надеемся решить проблему.
Я не уверен, требуется ли этот метод для шаблонов, но он подходит для классов, не являющихся шаблонами.
person
Yakk - Adam Nevraumont
schedule
20.03.2016
tree
, почему бы не сделатьTuple
параметром типа, а не параметром шаблона? - person Alan Stokes   schedule 20.03.2016static_tree
в этом случае? Это была бы бесконечная рекурсия, не так ли? - person 0xbadf00d   schedule 20.03.2016std::array
нужен целочисленный параметр. Невозможно указать его где-то. Что касается того, где это находится, есть много альтернатив, и ваша не так уж и очевидна. - person davidhigh   schedule 20.03.2016bind
. - person 0xbadf00d   schedule 20.03.2016bind
, но явным. Более общий вариант невозможен, как упоминалось @idljarn: причина этого в том, что вы не можете обычно указывать параметры шаблона результирующего шаблона класса... вы не можете использовать для этого пакет параметров, так как в каждой позиции вы также может иметь параметр шаблона, отличный от типа. - person davidhigh   schedule 20.03.2016