Di seguito è disponibile una funzione di modello denominata ProxyCall, che accetta un oggetto, una funzione membro e i relativi argomenti. Semplicemente inoltra la chiamata alla funzione membro.Deduzione di tipo di riferimenti const in funzioni di modello
Vorrei essere in grado di chiamare la funzione senza utilizzare i qualificatori di modello (si immagini tonnellate di tali chiamate con più argomenti). La deduzione di tipo funziona principalmente ma i compilatori (entrambi msvc e gcc 4.9) barf quando provo a passare i parametri di riferimento const come nell'esempio.
#include <string>
struct Widget {
void f(const std::string& s, bool b) {}
};
template<typename T, typename... Args>
void ProxyCall(T &obj, void(T::*method)(Args...), Args&&... args) {
(obj.*method)(std::forward<Args>(args)...);
}
int main(int argc, char* argv[])
{
Widget w;
std::string s;
ProxyCall<Widget, const std::string&, bool>(w, &Widget::f, s, true); // OK
ProxyCall(w, &Widget::f, (const std::string&)s, true); // also OK
ProxyCall(w, &Widget::f, s, true); // ERROR: template parameter is ambiguous
return 0;
}
La mia domanda è: come posso modificare il codice di cui sopra in modo che il compilatore dedurre automaticamente i tipi senza ricorrere alla qualificazione dei modelli espliciti o cast esplicito. Sembra che questo dovrebbe essere possibile considerando che il compilatore conosce già i tipi di argomenti esatti dalla firma di Widget :: f.
'template void ProxyCall (T & obj, metodo M, Args && ... args) ' –
zch
o in alternativa' template void ProxyCall (T & obj, void (T: : * metodo) (Margs ...), Args && ... args) ' –
zch