C ++: по какому шаблону я могу следовать для одноэлементного класса, требующего реализации для конкретной платформы? - PullRequest
0 голосов
/ 23 апреля 2019

Мне нужно определить одноэлементный класс в C ++, который реализуется отдельно на разных платформах.(например, macOS, Windows, Linux и т. д.) В случае, если это имеет значение, это для приложения Qt, а синглтон будет наследоваться от QObject.

. Я мог бы сделать это, просто используя некоторые директивы препроцессора и включаяполностью отдельные реализации, например так:

// Singleton.h
#include <QtGlobal>

#if defined Q_OS_WIN
    #include "Singleton_win.h"
#elif defined Q_OS_MAC
    #include "Singleton_mac.h"
#elif ... etc ...
#endif

Однако, для моего собственного планирования и здравомыслия я был бы рад, если бы был способ определить, какие фактические методы должны быть реализованы на всех платформах, чтобыразличные реализации могут оставаться по крайней мере частично синхронизированными.

Если бы я программировал на языке с интерфейсами, я бы справился с этим, просто определив интерфейс и сделав так, чтобы каждая специфичная для платформы версия синглтона реализовала его.

Однако это C ++, и ближе всего к интерфейсу у меня есть абстрактный базовый класс.Но использование абстрактного базового класса проблематично.Мне нужен статический метод, какой бы ни был синглетон, для получения глобального экземпляра этого синглтона, и, конечно, C ++ не допускает абстрактных статических методов.Я не могу использовать шаблонный статический метод, который возвращает правильную реализацию синглтона, потому что везде в моем коде, который использует синглтон, нет и не должно знать, какую реализацию он собирается использовать.

Наконец,Я действительно хотел бы избежать любых шаблонов, которые включают чрезмерное количество стандартного кода.Один такой шаблон, который, я чувствую, мог бы быть использован для создания этого синглтона, но квалифицируется как включающий чрезмерное количество шаблонов, является шаблоном PImpl, потому что это потребовало бы от меня что-то вроде этого:метод на Singleton, который я пишу, я должен добавить метод, который вызывает другой метод с идентичной подписью на Singleton::impl.Это всего лишь мое личное предпочтение, но я терпеть не могу такой шаблонный код!Я действительно хотел бы избежать этого.

Кроме того, как только мы рассмотрим, что это будет QObject -наследованный класс с сигналами Qt, слотами и, возможно, свойствами, наличие Singleton::impl представитдополнительные сложности, потому что Singleton должен излучать сигналы и принимать соединения от других QObjects.

Итак, есть ли какие-то шаблоны, которые я могу использовать, которые позволят мне реализовать этот синглтон так, как яхочу сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...