我有一个看起来像这样的程序
// 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 ++模板解决方案来避免这种情况。