Problema in breve:
Come si può implementare la funzionalità static if
, proposta in C++ 11, in semplice C++?statico se in chiaro C++?
Storia e problema originale:
Recentemente mi è venuto in mente un problema di questo tipo. Ho bisogno di una classe di Sender
con un'interfaccia simile
class Sender
{
void sendMessage(...);
void sendRequest(...);
void sendFile(...);
// lots of different send methods, not important actually
}
In alcuni casi ho bisogno di creare un DoubleSender, vale a dire un'istanza di questa classe, che avrebbe chiamato i suoi metodi per due volte, vale a dire al momento della chiamata, diciamo, un metodo sendMessage(...)
, lo stesso messaggio deve essere inviato due volte.
mie soluzioni:
Primo approccio:
Avere un isDouble
membro, e alla fine di ogni chiamata di metodo fare un controllo
sendMessage(...) { ... if(isDouble) { sendMessage(...); }
Beh, io non voglio questo, perché in realtà avrò bisogno di un doppio post molto recentemente, e questa parte del codice nella sezione time-critical sarà passiva al 98%.
Secondo approccio:
Ereditare una classe DoubleSender
da Sender
, e mettere in atto i suoi metodi come:
void DoubleSender::sendMessage(...)
{
Sender::sendMessage(...);
Sender::sendMessage(...);
}
Beh, questo è accettabile, ma richiede molto spazio di codice sgradevole (davvero molto, perché ci sono un sacco di diversi metodi send..
Terzo approccio:.
Ima gine che sto usando C++ 11 :). Allora posso fare questa classe generica e produrre la parte necessaria di codice secondo tempalte argomento utilizzando static if
:
enum SenderType { Single, Double };
template<SenderType T>
class Sender
{
void sendMessage(...)
{
// do stuff
static if (T == Single)
{
sendMessage(...);
}
}
};
Questo è più corto, più facile da leggere rispetto alle soluzioni precedenti, non genera codice aggiuntivo e ... è C++ 11, che purtroppo non posso usare nel mio lavoro.
Quindi, ecco dove sono arrivato alla mia domanda: come posso implementare l'analogo static if
in C++?
Inoltre, gradirei qualsiasi altro suggerimento su come risolvere il mio problema originale.
Grazie in anticipo.
Si potrebbe guardare a come Boost lo fa con la sua [static_assert] (http://www.boost.org/doc/libs/1_49_0/doc/html/boost_staticassert.html) forse? –
Si consiglia di familiarizzare con boost.mpl – Anycorn
'static se non esiste in C++ 11. –