0

我有一个代码被剪断,包括某种可变参数 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 本身就是一个可变参数类模板,但这似乎没有必要......

非常感谢您的帮助

4

1 回答 1

3

X是一个注入的类名,所以在类中确实XX<Features...>是等价的。

于 2018-08-16T07:18:19.127 回答