Мне нужно определить одноэлементный класс в 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
.
Итак, есть ли какие-то шаблоны, которые я могу использовать, которые позволят мне реализовать этот синглтон так, как яхочу сделать?