如何初始化模板中的成员数组

时间:2014-05-14 21:04:20

标签: c++ templates const allocation

我想有一个数组,其长度取决于我的模板的参数,但我一直得到"期望的常量表达式"错误。

enum MyEnum
{
    FIRST,
    OTHER
};

template<MyEnum e> 
struct MyTemplate
{
    static const int arrSize;
    int myArr[arrSize];            // error C2057: expected constant expression
    // int myArr[e == FIRST ? 4 : 10]; // works, but isn't very readable...
};

template<>
const int MyTemplate<FIRST>::arrSize = 4;

template<>
const int MyTemplate<OTHER>::arrSize = 10;

我必须使用的编译器不支持constexpr或任何其他C ++ 11功能,我也不能将数组大小作为模板参数传递。

编辑:我也不能使用new

由于

2 个答案:

答案 0 :(得分:5)

在某些情况下,我会添加一个函数get_array_size<e>()。既然你说你没有constexpr,那么还有不错的选择:

//I call this a pseudo-template-function, but there's probably better names
template<MyEnum> struct GetArraySize; //compiler error for default
template<> struct GetArraySize<FIRST> {static const int value=4;};
template<> struct GetArraySize<OTHER> {static const int value=10;};

template<MyEnum e> 
struct MyTemplate
{
    static const int arrSize = GetArraySize<e>::value;
    int myArr[arrSize];
};

http://coliru.stacked-crooked.com/a/f03a5fa94a038892

答案 1 :(得分:1)

我们在这里重新发明轮子吗? 枚举是编译时常量。就这样做:

enum MyEnum
{
    FIRST = 4,
    OTHER = 10
};

template<MyEnum e> 
struct MyTemplate
{
    int myArr[e];      
};

demo