Как создать объекты шаблонов вложенных классов с одним и тем же аргументом? - PullRequest
1 голос
/ 27 мая 2020

Как создавать объекты шаблонов вложенных классов с одним и тем же аргументом?

Как написать конструктор для компиляции следующего кода?

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> > > >'

1 Ответ

4 голосов
/ 27 мая 2020

Вы можете добавить второй конструктор преобразования. Если вы хотите поддерживать любой тип, просто сделайте этот конструктор шаблонным:

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 ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...