Информация об изменениях

Сообщение Re[3]: Функция, принимающая вложенный класс шаблонного класс от 12.04.2024 12:45

Изменено 12.04.2024 13:38 rg45

Re[3]: Функция, принимающая вложенный класс шаблонного класс
Здравствуйте, johny5, Вы писали:


J>Немного магии:

J>https://godbolt.org/z/ofhbhGGKc

J>Для моего варианта printer( A<int>::B<float> {} ); компилятор на самом деле выводит тип T1 (функции printer) как A<int>::B. Т.е. тип таки содержит объемлющую структуру.


Немного позандудствую: A<int>::B — нет тип, а шаблон типа (класса).

А теперь по существу. Я думаю, что ты совершенно напрасно использовал в своем примере шаблонный параметр шаблона. Пример стал сложнее, но это ни на шаг не приблизило тебя к решению. Ровно ту же самую проблему ты мог бы получить и на простом примере, с простым типом:

template<typename T>
void printer(T val)
{
    std::cout << "magic: ";
    print_type<T>();

}


Получаешь все то же самое: копмилятор точно так же выводит тип T как A<int>::B<float> (только теперь уже это на самом деле тип, а не шаблон). И точно так же этот тип включает в себя объемлющий тип A<int>. Но только вот проблема в том, что ты не можешь написать такую функцию, котора позволила бы тебе этот тип (A<int>) вывести. Средства языка не позволяют это сделать.
Re[3]: Функция, принимающая вложенный класс шаблонного класс
Здравствуйте, johny5, Вы писали:


J>Немного магии:

J>https://godbolt.org/z/ofhbhGGKc

J>Для моего варианта printer( A<int>::B<float> {} ); компилятор на самом деле выводит тип T1 (функции printer) как A<int>::B. Т.е. тип таки содержит объемлющую структуру.


Немного позандудствую: A<int>::B — это не тип, а шаблон типа (класса).

А теперь по существу. Я думаю, что ты совершенно напрасно использовал в своем примере шаблонный параметр шаблона. Пример стал сложнее, но это ни на шаг не приблизило тебя к решению. Ровно ту же самую проблему ты мог бы получить и на простом примере, с простым типом:

template<typename T>
void printer(T val)
{
    std::cout << "magic: ";
    print_type<T>();

}


Получаешь все то же самое: копмилятор точно так же выводит тип T как A<int>::B<float> (только теперь уже это на самом деле тип, а не шаблон). И точно так же этот тип включает в себя объемлющий тип A<int>. Но только вот проблема в том, что ты не можешь написать такую функцию, котора позволила бы тебе этот тип (A<int>) вывести. Средства языка не позволяют это сделать.