Это вызывает централизацию Singletons, которая может испортить зависимости в более сложных проектах.Библиотека с singleton.cpp
должна зависеть от всего, что необходимо для каждого синглтона .В то же время любой, кто использует синглтон, должен зависеть от библиотеки singleton.cpp
.
По сути, ваш код может работать только в монолитном немодульном проекте.Масштабировать его до нескольких динамических библиотек практически невозможно.
Ваш порядок инициализации должен поддерживаться вручную.
Точка построения статической глобальной переменной не чередуется со всем до первого выражения в main
.
Приличное решение, которое я использовал, заключается в создании динамической библиотеки, которая хранит одноэлементную память.
Чтобы быть одноэлементным, вы наследуете от помощника CRTP, который обеспечивает::Instance()
встроенный метод.Люди, которые хотят использовать синглтон, ::Instance()
.
::Instance()
создают статический токен времени жизни локальной переменной.Затем он пытается получить хранилище для синглтона из первичной DLL;если объект уже создан, он просто преобразует хранилище в тип объекта и увеличивает его счетчик ссылок.
Если нет, он создает новое хранилище и создает в нем объект.
Atуничтожение токена времени жизни статической локальной переменной уменьшает количество ссылок.Если этот счетчик ссылок достигает 0, он уничтожает его локально в текущей динамической библиотеке.
Время жизни синглтона теперь является объединением времени жизни созданных ::Instance()
переменных.Разрушение происходит в коде без стирания типа, поэтому нам не нужно беспокоиться о DLL с выгружаемым кодом.Хранение является центральным.Библиотека DLL, в которой хранится хранилище, должна быть на более низком уровне, чем каждый пользователь системы Singleton, но, в свою очередь, не имеет никаких зависимостей, так что это не проблема.
Это далеко не идеально;синглтоны и время жизни - постоянная проблема, потому что чистое завершение программы сложно и усложняет существование синглтона.Но до сих пор это работало в достаточно большом проекте.