Image

Imagesavenkov wrote in Imageru_cpp 😊impressed

Ну и ну

Сегодня наткнулся очень интересное решение, связанное с использованием методов-шаблонов :-)


Пусть у нас есть класс с методом-шаблоном foo:

class A
{
public:
template<class T>
int foo();
};

template<> int A::foo<int>()
{
return 1;
};

И мы хотим использовать этот метод в другом шаблоне (ну например шаблоне-функции) следующим образом:

template<typename T>
T bar()
{
A a;
return a->foo<T>();
}

Получаем ошибку на a->foo<T>().

Некоторое время назад, столкнувшись с такой ситуацией, я решил, что это связано с неопределённостью реального типа a или чем-то подобным. В тот раз я использовал I used a->A::foo() как workaround.

Сегодня коллега спросил меня про "а как это сделать", я подумал, погуглил, и нашёл вот такой выход:

template<typename T>
T bar()
{
A a;
return a->template foo<T>();
}

Весьма впечатляющая конструкция :-) Интересно, это "фича" g++ или в стандарте такое тоже допускается? (лень смотреть, если честно, вдруг кто знает :-)).