Problema en resumen:
¿Cómo podría implementarse la funcionalidad static if
, propuesta en C++ 11, en lenguaje simple C++?estática si está en formato C++?
Historia y problema original:
Recientemente surgió un problema como este. Necesito una clase Sender
con una interfaz como
class Sender
{
void sendMessage(...);
void sendRequest(...);
void sendFile(...);
// lots of different send methods, not important actually
}
En algunos casos, voy a necesitar para crear un DoubleSender, es decir, una instancia de esta clase, lo que llamar a sus métodos dos veces, es decir, cuando se llama a, digamos, un método sendMessage(...)
, el mismo mensaje debe enviarse dos veces.
Mis soluciones:
Primera aproximación:
tienen un miembro de isDouble
, y al final de cada llamada al método crea un cheque
sendMessage(...) { ... if(isDouble) { sendMessage(...); }
Bueno, no quieren esto, porque en realidad necesitaré publicar dos veces recientemente, y esta parte del código en la sección de tiempo crítico será pasiva en un 98%.
Segundo enfoque:
Heredar una clase DoubleSender
de Sender
, y poner en práctica sus métodos como:
void DoubleSender::sendMessage(...)
{
Sender::sendMessage(...);
Sender::sendMessage(...);
}
Bueno, esto es aceptable, pero necesita mucho espacio de código desagradable (realmente mucho, porque hay un montón de diferentes métodos send..
Tercer enfoque:.
Ima Creo que estoy usando C++ 11 :). Entonces puedo hacer esta clase genérica y producir la parte necesaria de código de acuerdo con tempalte argumento usando static if
:
enum SenderType { Single, Double };
template<SenderType T>
class Sender
{
void sendMessage(...)
{
// do stuff
static if (T == Single)
{
sendMessage(...);
}
}
};
Esto es más corto, más fácil de leer que las soluciones anteriores, no genera código adicional y ... es C++ 11, que desafortunadamente no puedo usar en mi trabajo.
Así que, aquí es donde llegué a mi pregunta: ¿cómo puedo implementar static if
analógico en C++?
Además, agradecería cualquier otra sugerencia sobre cómo resolver mi problema original.
Gracias de antemano.
Se podía ver cómo Boost lo hace con su [static_assert] (http://www.boost.org/doc/libs/1_49_0/doc/html/boost_staticassert.html) tal vez? –
Es posible que desee familiarizarse con boost.mpl – Anycorn
'static if' no existe en C++ 11. –