2014-02-21 3 views
0

Я бы хотел, чтобы класс наследовал от базового класса CRTP, который вызывает создание и запуск глобального конструктора до начала main(). Идея состоит в том, чтобы использовать это, чтобы зарегистрировать тип на некоторой карте, которую нужно искать позже. Кажется, что это работает, только если я фактически создал экземпляр класса Derived и использовал базовый класс.Глобальные конструкторы с CRTP

#include <iostream> 

class Foo { 
public: 
    Foo() { std::cout << "Foo" << std::endl; } 
}; 

template <typename T> 
class Bar { 
private: 
    static Foo foo_; 
}; 

class Test : public Bar<Test> { 
}; 

int main() { 
    return 0; 
} 

класс Test наследует от Bar<Test> который имеет статическую переменную-член типа Foo. К сожалению, конструктор Foo не вызывается. Я хотел бы иметь возможность заставить глобальный конструктор запускаться, когда класс создает экземпляр шаблона с использованием CRTP без необходимости создания экземпляра этого класса. Я был бы доволен решениями, зависящими от реализации.

ответ

0

Существует нет способа, кроме SomeClass instance в единицах перевода, чтобы иметь экземпляр глобального класса.

С шаблоном и статическим членом вы могли бы (или не могли) в конечном итоге использовать глобальные переменные в нескольких единицах перевода.

0

Если вы объявляете класс со статическими полями, не имеет значения, является ли он управляемым шаблоном или нет - статические члены не будут созданы, если вы не создадите экземпляр такого класса. И имейте в виду - время создания статических членов довольно сложно, особенно если у вас несколько библиотек.

Смежные вопросы