enum как шаблон - PullRequest
       8

enum как шаблон

5 голосов
/ 10 февраля 2011

Это то, что я хочу сделать:

enum MyEnum
{
    ONE = 1, TWO, THREE
};

template<class T>
void func()
{
    cout << T::TWO << endl;
}

int main()
{
    func<MyEnum>();
};

Это работает, но я получаю предупреждение: «предупреждение C4482: использовано нестандартное расширение: enum 'MyEnum' используется в квалифицированном имени»

Как я могу это сделать без предупреждения

Ответы [ 3 ]

5 голосов
/ 10 февраля 2011

Enum здесь немного сложнее. Типы ONE и TWO будут во внешнем пространстве имен. Таким образом, добавление типа к имени приводит к предупреждению. Вы можете просто удалить классификатор

template<class T>
void func()
{
    cout << TWO << endl;
}

Поскольку ДВА известна во внешнем пространстве имен. Вы также можете просто переместить ваше перечисление в какую-нибудь структуру.

struct EnumContainer
{
    enum MyEnum
    {
        ONE = 1, TWO, THREE
    };
};

template<class T>
void func()
{
    std::cout << T::TWO << std::endl;
}

int main()
{
    func<EnumContainer>();
};

Теперь с компилятором все должно быть в порядке.

1 голос
/ 10 февраля 2011

Перечисления (до C ++ 0x) обрабатываются как целочисленные типы.

На самом деле запись MyEnum :: TWO - это мусор: нет класса или пространства имен MyEnum. Имена ONE, TWO и THREE заносятся в пространство имен, в котором определяется enum [в данном случае глобальное пространство имен].

Вы должны получить сообщение об ошибке типа TWO is not a member of MyEnum.

Один из способов подражать поведению - это поместить его в структуру или класс, как предлагали другие.

1 голос
/ 10 февраля 2011

Хотя было бы неплохо использовать перечисление в качестве параметра шаблона и распознавать каждое отдельное перечисление отдельно, как вы его написали, этого не произойдет.Вместо этого я могу предложить вам объявить следующее:

template<MyEnum T>
void func(){
    std::cout << T << std::endl;
}

Самое замечательное в C ++ состоит в том, что способ структурирования шаблонов дает вам полную систему Turning.Следовательно, вам не нужен отдельный вызов, подобный этому, поскольку вы объявили, что получите каждое отдельное значение перечисления.Вы можете создать отдельную функцию для каждого значения , когда вам это нужно и только тогда, когда вам нужно .

Теперь, перейдя к другой проблеме вашего вопроса, как прокомментировал @delnan, вы можетеУ меня нет двух разных Enums с одинаковыми именами.Однако у вас может быть класс с переменной-членом, называемой TWO, такой, что:

struct Foo{
    int TWO;
};

struct Bar{
    int TWO;
};

template<typename T>
void func(){
    std::cout << T::TWO << std::endl;
}

Надеюсь, это поможет.

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