Этот вопрос о том, как использовать инициализацию глобальной переменной для достижения некоторого побочного эффекта до запуска main()
(например, регистрация класса фабрики до main()
). Это может быть сложно, когда шаблон включен. Рассмотрим следующий фрагмент кода:
template <class T>
class A {
public:
static bool flag;
static bool do_something() {
// Side effect: do something here.
}
template <bool&>
struct Dummy {};
// Important: Do not delete.
// This line forces the instantiation and initialization of `flag`.
using DummyType = Dummy<flag>;
};
template <class T>
bool A<T>::flag = A<T>::do_something();
// A<int>::flag is instantiated and.
// A<int>::do_something will be called before main to initialize A<int>::flag.
class B : A<int> {};
Если мы уберем using
, поведение будет другим:
template <class T>
class A {
public:
static bool flag;
static bool do_something() {
// Side effect: do something here.
}
// The `using` dummy part is missing.
};
template <class T>
bool A<T>::flag = A<T>::do_something();
// A<int>::flag is not instantiated.
// A<int>::do_something will not be called.
class B : A<int> {};
Мой вопрос: это using
трюк здесь вещь, указанная компилятором c, или это поддерживается стандартом C ++? Я провел некоторый поиск и нашел соответствующую информацию о стандарте 14.7.1, но все еще не уверен насчет правил для using
, поскольку он не упомянут в 14.7.1 (мой источник этот , не уверен, следует ли это рассматривать как основную истину). Кроме того, using Dummy
кажется мне несколько взломанным. Есть ли другие обходные пути, чтобы сделать его более элегантным? Цель состоит в том, чтобы разрешить создание экземпляров внутри самого class A
, чтобы сегменты кода, связанные с побочными эффектами, оставались закрытыми.