Контроль порядка инициализации глобальной переменной

Требуется заставить глобальную переменную конкретного типа быть инициализированной после инициализации всех остальных глобальных переменных.

Например:

int& getCounter()
{
    static int counter = 0;
    return counter;
}

class Incrementer
{
public:
    Incrementer()
    {
        getCounter()++;
    }
};

class SomeOtherThingy
{
public:
    SomeOtherThingy()
    {
        //делает что-то с результатом getCounter()
        //мы ожидаем, что getCounter() должен вернуть 3
    }
};

Incrementer i1{};
Incrementer i2{};
Incrementer i3{};

SomeOtherThingy thingy{};

В данном случае код работает - thingy инициализируется после всех объектов типа Incrementer. Однако, глобальные переменные типа Incrementer могут находиться в разных юнитах трансляции. В таком случае сохранить порядок определения глобальных перменных очень сложно. Разумеется в таком случае thingy не обязательно будет инициализирована последней.

Возможно ли как-то заставить глобальный объект типа SomeOtherThingy гарантированно инициализироваться после остальных глобальных объектов (хотя бы после объектов типа Incrementer)?

P.S. Реализация счётчика была представлена просто для примера. На деле там может быть что-то более сложное (структура данных, база данных, etc).


Ответы (1 шт):

Автор решения: ThisIsLikeMy6thAccount

Реализация подобного слишком сложна (и наверняка зависит от реализации, под которую пишем), поэтому лучше сделать инициализацию в начале main() и не заморачиваться.

→ Ссылка