C ++使用枚举继承模板类

时间:2019-01-16 10:09:42

标签: c++ templates enums

我有一个看起来像这样的程序

    // tuple example
    #include <iostream>     // std::cout
    #include <tuple>        // std::tuple, std::get, std::tie, std::ignore
    using namespace std;
    template <int i> class  xEnum
    {
    public:
        enum  val
        {
        x1,
        x2
        };
    };
    template <> class  xEnum<0>
    {
    public:
        enum val
        {
        RED,
        GREEN,
        WHITE
        };
    };
    template <> class  xEnum<1>
    {
    public:
        enum val
        {
        BANANA,
        ORANGE,
        APPLE
        };
    };

    class color:public xEnum<0>
    {
    public:
        static tuple<int, int, int> var;
        template< xEnum<0>::val i > static auto getVal()
        {
            return get<i>( var );
        }
    };
    tuple<int, int, int> color::var(10, 11, 12);

    class fruit:public xEnum<1>
    {
    public:

        static tuple<int, int, int> var;
        template< xEnum<1>::val i > static auto getVal()
        {
            return get<i>( var );
        }
    };
    tuple<int, int, int> fruit::var(20, 21, 22);
    template <int index> class variable:public xEnum<index>
    {
    public:
        static tuple<int, int, int> var;
        template< xEnum<index>::val i > static auto getVal()
        {
            return get<i>( var );
        }

    };
    int main ()
    {
      cout<<"Value is "<<color::getVal<color::RED>()<<endl;
      cout<<"Value is "<<color::getVal<color::GREEN>()<<endl;
      cout<<"Value is "<<color::getVal<color::WHITE>()<<endl;
      cout<<"Value is "<<fruit::getVal<fruit::BANANA>()<<endl;
      cout<<"Value is "<<fruit::getVal<fruit::ORANGE>()<<endl;
      cout<<"Value is "<<fruit::getVal<fruit::APPLE>()<<endl;

      return 0;
    }

该程序编译没有任何问题。程序的输出是

    $ g++ -Os -std=c++1y prog.cpp
    $ ./a.exe
    Value is 10
    Value is 11
    Value is 12
    Value is 20
    Value is 21
    Value is 22

查看类的颜色和水果表明它们具有相似的模式。因此,我尝试将通用类代替这两个类,如下所示:

    template <int index> class variable:public xEnum<index>
    {
    public:
        static tuple<int, int, int> var;
        template< xEnum<index>::val i > static auto getVal()
        {
            return get<i>( var );
        }

    };

但是使用上面的模板类,我得到下面的编译器错误:

     error: 'xEnum::val' is not a type
         template< xEnum<index>::val i > static auto getVal()

有人可以建议一种方法来消除此编译器错误,或者以通用的方式定义两个类的结果和颜色吗?

谢谢。

我想出的唯一方法是

    #define var_class(x, y)  class x:public xEnum<y> \
                             { \
                             public:  \
                                 static tuple<int, int, int> var; \
                                 template< xEnum<y>::val i > static auto getVal() \
                                 { \
                                     return get<i>( var ); \
                                 } \
                             }\

上面的宏有效,但是我不太热衷于使用宏来避免c ++中代码的重复。应该有一些优雅的c ++模板解决方案来避免这种情况。

0 个答案:

没有答案