C++ 带可变构造器的奇异混合

C++ 带可变构造器的奇异混合,c++,variadic-templates,mixins,crtp,injected-class-name,C++,Variadic Templates,Mixins,Crtp,Injected Class Name,我截取了一段代码,包括一些类型的可变混合crtp和一些相关问题。我是否正确理解在下面的代码中,第二个构造函数只是将用于实例化X的那些类的实例的副本传递给这些类的构造函数 template<class DerivedT> struct CuriousBase{}; template<template<typename> typename... Features> struct X : Features<X<Features...>> .

我截取了一段代码,包括一些类型的可变混合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>{};
}
模板
结构CuriousBase{};
模板
结构X:功能。。。{
X()=默认值;
X(特征…f):特征(f)…{}
};
int main(){
自动x=x{};
}
这种行为的用例是什么?这个示例和下面的代码片段之间有什么区别

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>{};
}
模板
结构CuriousBase{};
模板
结构X:功能。。。{
X()=默认值;
X(特征…f):特征(f)…{}
};
int main(){
自动x=x{};
}
两者都可以编译,但我认为,必须明确指定X本身是一个可变类模板,但这似乎不是必需的


非常感谢您的帮助

X
是a,因此
X
X
在类内是等效的。

X
是a,因此
X
X
在类内是等效的。

我明白了。非常感谢。这与我在类的作用域内定义类的成员函数时不需要重复类模板的模板参数的原因是一样的,而不是在类的作用域外单独定义它们。在这里,我必须在定义成员函数之前预先编写它们。那么我的另一个问题呢?这是一个简单的构造函数,它使用基类来构造它们。是的,我知道,但在这个特定的例子中,我看不到任何用处,因为在构造X时,我不能将基类的左值传递给它的构造函数,因为这些基类作为模板类依赖于它们的派生类;)由于该类什么都不做,很难为这些构造函数找到真正的用例,
X{CuriousBase{/*…*/}
可能对更复杂的
CuriousBase
有用。我明白了。非常感谢。这与我在类的作用域内定义类的成员函数时不需要重复类模板的模板参数的原因是一样的,而不是在类的作用域外单独定义它们。在这里,我必须在定义成员函数之前预先编写它们。那么我的另一个问题呢?这是一个简单的构造函数,它使用基类来构造它们。是的,我知道,但在这个特定的例子中,我看不到任何用处,因为在构造X时,我不能将基类的左值传递给它的构造函数,因为这些基类作为模板类依赖于它们的派生类;)由于类什么都不做,很难找到这些构造函数的实际用例,
X{CuriousBase{/*…*/}
可能对更复杂的
CuriousBase
有用。