Проблема вкратце: Как можно реализовать функциональность static if
, предложенную в c ++ 11, на простом языке c ++?
История и исходная проблема: Недавно у меня возникла такая проблема.Мне нужен класс 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, который я, к сожалению, не могу использовать в своей работе.
Итак, вот где я пришел к своему вопросу - как я могу реализовать static if
аналог в c ++?Кроме того, я был бы признателен за любые другие предложения о том, как решить мою первоначальную проблему.Заранее спасибо.