Проблема вкратце:
Как можно реализовать статическую функциональность 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..
методов.
Третий подход:
Представьте, что я использую c++11 :). Затем я могу сделать этот класс универсальным и создать необходимую часть кода в соответствии с аргументом tempalte, используя static if
:
enum SenderType { Single, Double };
template<SenderType T>
class Sender
{
void sendMessage(...)
{
// do stuff
static if ( T == Single )
{
sendMessage(...);
}
}
};
Это короче, легче читать, чем предыдущие решения, не генерирует дополнительный код и.. , это c++11, который я, к сожалению, не могу использовать в своей работе.
Итак, вот где я пришел к своему вопросу - как я могу реализовать статический аналог if
в C++?
Кроме того, я был бы признателен за любые другие предложения о том, как решить мою первоначальную проблему.
Заранее спасибо.