статический констант std :: array в классе - PullRequest
1 голос
/ 15 октября 2011

У меня есть шаблонная структура с некоторыми перечислениями, и для удобства я хотел бы создать массив std :: с перечислениями в нем.Есть ли способ сделать следующее?

template< typename A >
struct someClass{
    enum class State{
        sA,
        sB,
        sC
    }

    static const std::array<State,4> the_states = {{
        State::sA,
        State::sB,
        State::sC
    }};

};

Ответы [ 2 ]

5 голосов
/ 15 октября 2011

Нет.Внутри класса могут быть инициализированы только статические члены-интегралы данных const.

Однако вы можете сделать это ...

template< typename A >
struct someClass
{
    enum State
    {
        sA,
        sB,
        sC
    };

    static const std::array<const State,4> the_states;
};

template<typename A>
const std::array<const someClass::State,4> someClass<A>::the_states = 
{
    someClass::State::sA, 
    someClass::State::sB, 
    someClass::State::sC 
};
3 голосов
/ 15 октября 2011
#include <iostream>
#include <array>

template< typename A >
struct someClass{
    enum class State {
        sA,
        sB,
        sC
    };

    static const std::array<State,3> the_states;    
};

template<typename A>
const std::array<typename someClass<A>::State,3> someClass<A>::the_states = {
    someClass<A>::State::sA,
    someClass<A>::State::sB,
    someClass<A>::State::sC
};

int main() {
    for( auto i : someClass<int>::the_states) {
        switch(i) {
            case someClass<int>::State::sA:
                std::cout << "sA" << std::endl;
                break;
            case someClass<int>::State::sB:
                std::cout << "sB" << std::endl;
                break;
            case someClass<int>::State::sC:
                std::cout << "sC" << std::endl;
                break;
        }
    }
}

обратите внимание, что вы не можете завершить список с 0, как вы пытались с массивом из 4 элементов, потому что 0 не может быть преобразован в состояние перечислимого класса.

Бах, и за то время, которое понадобилось мне, чтобы отредактировать мой ответ с реальным ответом, Дэйв получил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...