如何构造具有相同参数的嵌套 class 模板的对象?

How to construct objects of nested class templates with the same argument?

如何构造具有相同参数的嵌套 class 模板的对象?

如何编写构造函数使下面的代码通过?

template<typename T>
struct S {
    T v;

    S(T v) : v{v} {}
};

int main() {
    S<int>{0};          // OK.
    S<S<int>>{0};       // OK.
    S<S<S<int>>>{0};    // Compilation error. I want this to compile.
    S<S<S<S<int>>>>{0}; // Compilation error. I want this to compile.
    // ...              //                    I want more...
}

编译错误:

no matching constructor for initialization of 'S<S<S<int> > >'
no matching constructor for initialization of 'S<S<S<S<int> > > >'

您可以添加第二个转换构造函数。如果您想支持任何类型,只需将此构造函数模板化即可:

template <typename T>
struct S {
   T v;

   S(T v) : v{v} {}

   template <typename U>
   S(U v) : v{v} {}
};

本作品如下:

   S<int>{0};          
   S<S<int>>{0};       
   S<S<S<int>>>{0};    
   S<S<S<S<int>>>>{0}; 

   S<double>{0.0};
   S<S<double>>{0.0};       
   S<S<S<double>>>{0.0};    
   S<S<S<S<double>>>>{0.0}; 

现场演示:https://godbolt.org/z/NKEGRz

请注意,在最底层,两种构造函数都适用,但将根据 C++ 重载规则选择非模板构造函数。