Ho una classe A che ha un parametro template T. Ci sono casi d'uso in cui la classe T offre una funzione func1() e ci sono casi d'uso in cui T doesn lo offro. Una funzione f() in A dovrebbe chiamare func1(), se esiste. Penso che questo dovrebbe essere possibile con boost mpl, ma non so come. Ecco alcuni pseudo codice:Boost MPL: chiama una funzione (membro) solo se esiste
template<class T>
class A
{
void f(T param)
{
if(T::func1 is an existing function)
param.func1();
}
};
Ancora meglio sarebbe un altro caso:
template<class T>
class A
{
void f(T param)
{
if(T::func1 is an existing function)
param.func1();
else
cout << "func1 doesn't exist" << endl;
}
};
Anche se si riesce a trovare una condizione corretta, il codice non verrà compilato. Entrambi i rami di if devono essere compilati e se la funzione non esiste, il ramo vero non verrà compilato. –
Con la specializzazione del modello non è necessario che entrambe le parti vengano compilate. In qualche modo dovrei chiamare una funzione template con il parametro T e questa funzione ha un comportamento diverso quando T offre o non offre func1(). Sono sicuro che boost mpl offre qualcosa per questo caso d'uso. Non so come usarlo. – Heinzi
C++ 11 è un'opzione? –