Пусть где-то в моем коде есть функция foo
с универсальным опорным параметром, который я не могу изменить:разрешение C++ Перегрузка с универсальным шаблоном опорной функции, которые не могут быть изменены
template<typename T>
auto foo(T&& t) { std::cout<<"general version"<<std::endl; }
Теперь я хочу перегрузите foo
для данного класса A
и убедитесь, что для любого классификатора и ссылочного типа A
вызывается перегрузка. Для этого я могу отладочный forcely обеспечить перегрузку для всех возможных квалификации (игнорировать volatile
на данный момент):
auto foo(A & a) { std::cout<<"A&"<<std::endl; }
auto foo(A const& a) { std::cout<<"A const&"<<std::endl; }
auto foo(A && a) { std::cout<<"A &&"<<std::endl; }
auto foo(A const&& a) { std::cout<<"A const&&"<<std::endl; }
Demo. Это, однако, весит очень плохо для получения дополнительных параметров.
С другой стороны, я могу передать по значению, которое, кажется, чтобы захватить, а все предыдущие случаи:
auto foo(A a) { std::cout<<"A"<<std::endl; }
Demo. Теперь нужно скопировать большой объект (по крайней мере в принципе).
Есть ли элегантный способ решения этих проблем?
Помните, что я не могу изменить универсальную опорную функцию, поэтому SFINAE и тому подобное не имеют возможности.
пишет функцию обертки, которая перенаправляет аргументы правильной функции и с помощью этого вместо разумного решения для вас? – TartanLlama
AFAIK компилятор всегда ищет наиболее подходящий вариант. Что делать, если вы добавили enable_if> в "перегрузку"? –
@TartanLlama: не совсем. В коде соответствующая функция - 'operator &&' (я просто взял 'foo' в качестве простого примера). Это библиотека, и это слишком ошибочно. – davidhigh