У меня есть кусок кода, похожий на этот:
#include <iostream>
using namespace std;
template<typename T>
class Class
{
public:
Class() {}
void foo(T) {cout << "foo(T) is called \n";}
void foo(T&) {cout << "foo(T&) is called \n";}
};
int main()
{
Class<int> c;
int a = 1;
c.foo(1);
c.foo(a);
return 0;
}
Я хочу, чтобы обе функции перегружены foo
так как foo(T&)
является более эффективным, но я не могу использовать буквальную константу в качестве аргумента и foo(T)
будет работать для буквальных констант, хотя это не так эффективно, как foo(T&)
, Но когда я определю обе функции, произойдет неоднозначный вызов, когда c.foo(a)
собирается выполнить.
ошибка: вызов перегруженного ‘foo (int&) ‘неоднозначно
Как я могу преодолеть эту проблему?
Вы можете пройти по постоянной ссылке const T&
чтобы он также принимал буквальные константы или передавал ссылку на rvalue T&&
вместо T
так что он будет принимать только значения r (например, буквальные константы)
Других решений пока нет …