S
Ich glaube, ich sollte meine Fragen besser strukturieren ; )
1. Was gibt es für Anwendungsfälle bzw. was wird durch den folgenden Code bezweckt? im custom ctor wird der copy ctor der superklasse aufgerufen...
template <typename T>
struct Widget : T {
Widget(T t) : T(t);
};
2. Sehe ich das richtig, das der zweite ctor theeoretisch Kopien von Instanzen der Klassen mittels derer X instantiiert wurde, an eben genau die ctors dieser Klassen (Superobjekte von 'X) weiterreichen würde?
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>{};
}
3. Mir scheint es aber bedingt durch die Mischung aus CRTP und Mixin in diesem Fall nicht möglich, diesen ctor jemals durch Übergabe von lvalues der jeweiligen Objekte zu verwenden, da beide Klassen class-templates sind und CuriousBase als Argument für den X ctor mit X instantiiert werden müsste, und immer so fort. Liege ich da richtig?
4. Wo ist der Unterschied zwischen obigem Code und dem hier folgenden? Er kompiliert ebenfalls, jedoch dachte ich, dass man angeben muss, dass X seinerseits wieder ein variadisches class template ist, scheint aber nicht nötig zu sein, oder wo ist der Unterschied zwischen beiden Versionen?
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>{};
}
5. Mir scheint, die einzige Möglichkeit (ohne Designated Initializers von C++20) im Falle von beispielsweise zwei Klassen die "mixed in" werden sollen, explizit argumente an diese beiden Superklassen zu geben, ist mit diesem Syntax, bei dem lokale Objekte der "mixed-in" Klassen im Ctor angelegt werden, die dann den copy-ctor der jeweiligen Basisklasse aufrufen, ist das korrekt?
#include <string>
template <template <typename> typename... Features>
struct X : Features<X<Features...>>... {
X() = default;
X(Features<X>... f) : Features<X>(f)... {}
};
template <typename T>
struct A {
A() = default;
A(int a1, int a2) : a1_{a1}, a2_{a2} {}
int a1_, a2_;
};
template <typename T>
struct B {
B() = default;
B(std::string b) : b_{b} {}
std::string b_;
};
int main() {
auto x1 = X<A, B>{}; // Ok
auto x2 = X<A, B>{{1, 2}, {std::string("test")}}; // Ok
auto x3 = X<A, B>{1, 2, std::string("test")}; // Error
}
Danke für eure Hilfe