Вы можете сделать класс шаблоном (возможно, с параметром шаблона по умолчанию), и тогда определение элемента данных stati c будет реализовано только тогда, когда (odr-) используется где-то в программе.
Это требует Вы должны переместить определение членов класса в заголовок. Если это слишком большое влияние, вы можете рассмотреть возможность помещения члена stati c в базовый класс, который является шаблоном класса, который будет иметь тот же эффект, что и весь класс в качестве шаблона, пока вы не t ссылка на элемент * stati c где угодно. В любом случае определение элемента stati c необходимо будет переместить в заголовок (явное создание экземпляра будет противодействовать ожидаемому эффекту.)
Это не значит, что если элемент stati c используется (odr-), инициализатор будет запускаться только при первом использовании переменной при запуске программы. Является ли это так или нет, зависит от реализации.
Альтернатива, которая гарантирует не только то, что инициализатор никогда не запускается, когда переменная не используется в программном коде, но и гарантирует, что он запускается именно при первом использовании, - чтобы использовать локальную переменную static
в функции-члене static
:
static const Bar& constVar() {
static const Bar instance(1);
return instance;
};
Затем используйте ее как constVar()
вместо constVar
. (Определение функции также может быть вне класса.) Однако это может привести к снижению производительности, поскольку реализация локальной статики должна быть поточно-ориентированной.