Проблема:
Как реализовать функцию static if
, предложенную в С++ 11, в простой С++?
История и оригинальная проблема:
Недавно я столкнулся с такой проблемой. Мне нужен класс Sender
с интерфейсом вроде
class Sender
{
void sendMessage( ... );
void sendRequest( ... );
void sendFile( ... );
// lots of different send methods, not important actually
}
В некоторых случаях мне нужно будет создать DoubleSender, то есть экземпляр этого класса, который дважды будет вызывать его методы, то есть при вызове, скажем, в методе sendMessage(...)
одно и то же сообщение нужно отправить дважды.
Мои решения:
Первый подход:
Имейте член isDouble
, и в конце каждого вызова метода выполните проверку
sendMessage(...) { ... if( isDouble ) { sendMessage( ... ); }
Ну, я не хочу этого, потому что на самом деле мне понадобится двойная публикация совсем недавно, и эта часть кода в критическом для времени разделе будет пассивным на 98%.
Второй подход:
Наследуйте класс DoubleSender
от Sender
и реализуйте его методы, например:
void DoubleSender::sendMessage( ... )
{
Sender::sendMessage(...);
Sender::sendMessage(...);
}
Ну, это приемлемо, но занимает много места неприятного кода (очень много, потому что существует множество разных методов send..
.
Третий подход:
Представьте, что я использую С++ 11:). Затем я могу сделать этот класс обобщенным и создать необходимую часть кода в соответствии с аргументом tempalte, используя static if
:
enum SenderType { Single, Double };
template<SenderType T>
class Sender
{
void sendMessage(...)
{
// do stuff
static if ( T == Single )
{
sendMessage(...);
}
}
};
Это короче, легче читать, чем предыдущие решения, не генерирует дополнительный код и... это С++ 11, который, к сожалению, я не могу использовать в своей работе.
Итак, вот где я пришел к моему вопросу - как я могу реализовать аналог static if
в С++?
Кроме того, я был бы признателен за любые другие предложения о том, как решить мою оригинальную проблему.
Спасибо заранее.