Предположим, что у меня есть следующие определения:
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), но это кажется взломанным и громоздким. Есть ли лучший способ?