статический, если в простом С++?

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

12
задан Mechanical snail 22 August 2012 в 20:43
поделиться