Supponiamo di voler sviluppare una libreria generica che dovrebbe essere utilizzabile con tipi di tipo numerico compresi tipi doppi e definiti dall'utente. Il problema, che sto affrontando in questo momento è che non so come scrivere il tipo di ritorno di una funzione di modello molto simile a questo:Determinazione del tipo di ritorno di "funzione generica"
template<class T>
auto transmogrify(T x)
-> ???
{
using std::abs;
return abs(x)+2.0;
}
La dichiarazione utilizzando rende il lavoro del corpo di questo modello di funzione per i tipi primitivi perché questi non hanno uno spazio dei nomi associato (e quindi non c'è ADL). Ma voglio che la trasmogrificazione usi funzioni abs specialistiche nel caso in cui l'autore di un tipo definito dall'utente fornisca la sua funzione abs. Non posso semplicemente utilizzare
-> decltype(abs(x)+2.0)
perché questo non avrebbe funzionato per, diciamo, dal momento che raddoppia std :: abs non è nel campo di applicazione (per quanto posso dire). Ma scrivere
-> decltype(std::abs(x)+2.0)
disabilita ADL. Ma disabilitare ADL non è un'opzione. Inoltre, il valore restituito da una funzione abs specifica potrebbe non essere di tipo T ma di un altro tipo.
Eventuali idee su come risolvere il problema del tipo restituito mentre (a) mantenere ADL e (b) ricadere su alcune funzioni predefinite (come std :: abs in questo caso) per i tipi che non forniscono un abs specializzato .
'# define ab utilizzando std :: abs; your_template_fn #undef ab' non è sicuro se quella buona scelta per fare –
qualcuno possa commentare sopra la cosa è buona o no? –
@ Mr.Anubis e in che modo determinare il tipo di funzione di restituzione che utilizza questa definizione? – ForEveR