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