Лучше использовать '#ifdef' или наследование для кросс-компиляции?

Для следования из моего предыдущего вопроса о виртуальном и множественном наследовании (в кросс-платформенном сценарии) - после чтения некоторых ответов мне пришло в голову, что я мог упростить свою модель путем хранения сервера и клиентских классов, и замены платформы определенные классы #ifdefs (который является тем, что я собирался сделать первоначально).

Будет использование этого кода быть более простым? Это означало бы, что, по крайней мере, будет меньше файлов! Оборотная сторона - то, что это создает несколько "ужасное" и немного более твердое для чтения Foobar класс с тех пор существует #ifdefs повсеместно. Обратите внимание, что наш Unix, исходный код Foobar никогда не будет передаваться компилятору, таким образом, это будет иметь тот же эффект как #ifdef (так как мы также использовали бы #ifdef решить что платформа определенный класс для вызова).

class Foobar {
public:
  int someData;

#if WINDOWS
  void someWinFunc1();
  void someWinFunc2();
#elif UNIX
  void someUnixFunc1();
  void someUnixFunc2();
#endif

  void crossPlatformFunc();
};

class FoobarClient : public Foobar;
class FoobarServer : public Foobar;

Примечание: Некоторый материал (ctor, и т.д.) не учтенный для более простого примера.

Обновление:

Для тех, кто хочет читать больше в фон этой проблемы, я действительно предлагаю скользить по соответствующему потоку списка рассылки. Вещь начинает становиться интересной вокруг 3-го сообщения. Также существует связанная фиксация кода, с которой Вы видите реальный рассматриваемый код здесь.

6
задан Community 23 May 2017 в 10:32
поделиться