Co to jest idiom C ++ równoważny statycznemu blokowi Java?

Mam klasę z niektórymi członkami statycznymi i chcę uruchomić jakiś kod, aby je zainicjować (załóżmy, że tego kodu nie można przekonwertować na proste wyrażenie). W Javie po prostu bym to zrobił

class MyClass {
    static int myDatum;

    static {
        /* do some computation which sets myDatum */
    }
}

Jeśli się nie mylę, C ++ nie zezwala na takie statyczne bloki kodu, prawda? Co powinienem robić zamiast tego?

Chciałbym rozwiązania dla obu następujących opcji:

Inicjalizacja ma miejsce, gdy proces ładuje się (lub gdy ładowana jest biblioteka DLL z tą klasą).Inicjalizacja ma miejsce, gdy instancja klasy zostanie po raz pierwszy utworzona.

W przypadku drugiej opcji myślałem o:

class StaticInitialized {
    static bool staticsInitialized = false;

    virtual void initializeStatics();

    StaticInitialized() {
        if (!staticsInitialized) {
            initializeStatics();
            staticsInitialized = true;
        }
    }
};

class MyClass : private StaticInitialized {
    static int myDatum;

    void initializeStatics() {
        /* computation which sets myDatum */
    }
};

ale nie jest to możliwe, ponieważ C ++ (w tej chwili?) nie pozwala na inicjalizację niestałych elementów statycznych. Ale przynajmniej zmniejsza to problem statycznego bloku do statycznego inicjowania przez wyrażenie ...

questionAnswers(6)

yourAnswerToTheQuestion