Как однозначно ссылаться на функцию с перегрузками шаблонов

Предположим, что у меня есть следующие определения:

int f(int ) { return 1; } // a)

template<typename T> int f(T x) { return 2; } // b)

Я понимаю, что если я назову f, например. f(1), предпочтительной будет нестационарная перегрузка а), но есть ли способ однозначно ссылаться на а)? Например, я могу использовать f<int> для ссылки на b) недвусмысленно.

В качестве примера того, почему это было бы полезно, рассмотрим следующую функцию:

template<typename Func, typename T> void print_result(Func f, T arg) 
{ 
   std::cout << f(arg) << std::endl; 
}

Если я попытаюсь использовать его на f, например, print_result(f,1), я получаю ошибку компиляции (компилятор не знает, что из f я имею в виду). Я могу использовать print_result(f<int>,1), чтобы сказать ему, чтобы он использовал b), но как я могу сказать, что он использует a)?

Я нашел, что могу использовать print_result(static_cast<int (*)(int)>(f), 1), но это кажется взломанным и громоздким. Есть ли лучший способ?

Ответ 1

используйте специализированную специализацию:

template<>
int f<int>(int x ) { return 1; } // a)