Вызывает ли использование `` в классе шаблона? - PullRequest
2 голосов
/ 08 февраля 2020

Этот вопрос о том, как использовать инициализацию глобальной переменной для достижения некоторого побочного эффекта до запуска 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, чтобы сегменты кода, связанные с побочными эффектами, оставались закрытыми.

...