У меня есть фрагмент кода, включающий в себя variadic mixin crtp некоторых типов и несколько связанных вопросов. Правильно ли я понимаю, что в следующем коде второй конструктор просто передает копии экземпляров тех классов, которые использовались для создания экземпляра X, конструкторам тех же самых классов?
template<class DerivedT>
struct CuriousBase{};
template<template<typename> typename... Features>
struct X : Features<X<Features...>> ... {
X() = default;
X(Features<X<Features...>> ...f) : Features<X<Features...>>(f)... {}
};
int main(){
auto x = X<CuriousBase>{};
}
каковы варианты использования для такого поведения и в чем разница между этим образцом и следующим фрагментом?
template<class DerivedT>
struct CuriousBase{};
template<template<typename> typename... Features>
struct X : Features<X<Features...>> ... {
X() = default;
X(Features<X> ...f) : Features<X>(f)... {}
};
int main(){
auto x = X<CuriousBase>{};
}
Оба компилируются, но я подумал, что нужно явно указать, что X сам по себе является шаблоном с переменным классом, но в этом нет необходимости …
помощь очень ценится
X
это введенное имя класса, так и есть X
а также X<Features...>
эквивалентны внутри класса.
Других решений пока нет …