Supponiamo da qualche parte nel mio codice è una funzione foo
con un parametro di riferimento universale, che non posso cambiare:risoluzione C++ sovraccarico con funzione di modello di riferimento universale, che non può essere cambiato
template<typename T>
auto foo(T&& t) { std::cout<<"general version"<<std::endl; }
Ora voglio sovraccarico foo
per una determinata classe A
e assicurarsi che per ogni qualificatore e tipo di riferimento di A
venga chiamato il sovraccarico. Per questo posso bruta forcely fornire un sovraccarico per tutte le qualifiche possibili (ignorare volatile
per ora):
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. Questo tuttavia scala molto male per ulteriori parametri.
alternativa, posso passare dal valore, che sembra catturare così tutti i casi precedenti:
auto foo(A a) { std::cout<<"A"<<std::endl; }
Demo. Ora però è necessario copiare un oggetto di grandi dimensioni (- almeno in linea di principio).
C'è un modo elegante per risolvere questi problemi?
Ricordare che non è possibile modificare la funzione di riferimento universale, quindi SFINAE e simili non sono possibili.
sta scrivendo una funzione wrapper che inoltra argomenti per il corretto funzionamento e l'utilizzo che, invece di una soluzione ragionevole per voi? – TartanLlama
AFAIK il compilatore cerca sempre l'opzione più specifica. Cosa succede se si aggiunge un enable_if> su "overload"? –
@TartanLlama: non proprio. Nel codice la funzione corrispondente è 'operator &&' (ho appena preso 'foo' come un semplice esempio). È una biblioteca e questo è troppo sbagliato. – davidhigh