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