что-то вроде объявления об использовании для перечислений? - PullRequest
1 голос
/ 21 октября 2010

В основном это то, что я хотел бы сделать:

struct A {
    enum E {
        X, Y, Z
    };
};

template <class T>
struct B {
    using T::E;
};

// basically "import" the A::E enum into B.
std::cout << B<A>::X << std::endl;

Причина в том, что я хочу в основном внедрить детали реализации в мой шаблонный класс. В то же время перечисление «модели» отражает информацию, которую я хочу, чтобы пользователь мог иметь для конкретной реализации шаблона. Возможно ли это?

Я знаю, что могу иметь B наследовать от A, но я думаю, что это не идеальное решение, потому что я хочу иметь возможность добавлять новые "модели", не меняя кишки B.

РЕДАКТИРОВАТЬ: Теперь, когда я об этом, наследство не обязательно должно быть исключено. Возможно, следующее идеально:

struct A {
    enum E {
        X, Y, Z
    };
};

template <class T>
struct B : A {
};

int main() {
    std::cout << B<A>::X << std::endl;
}

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

Это работает для меня:

struct A {
    enum E {
        X, Y, Z
    };
};

template <class T>
struct B {
    typedef typename T::E E;
};

// basically "import" the A::E enum into B.
int main(void)
{
    std::cout << B<A>::E::X << std::endl;
    return 0;
}

Выход

0

Я получаю предупреждение о нестандартном расширении в этом квалифицированном имени, так что возможно есть более элегантное решение.

1 голос
/ 21 октября 2010

Я думаю, что вы можете сделать

template <class T>
struct B {
    typedef typename T::E E;
};
...