Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在模板中初始化成员数组_C++_Templates_Constants_Allocation - Fatal编程技术网

C++ 如何在模板中初始化成员数组

C++ 如何在模板中初始化成员数组,c++,templates,constants,allocation,C++,Templates,Constants,Allocation,我想要一个数组,它的长度取决于模板的参数,但我一直得到“expected constant expression”错误 enum MyEnum { 第一, 其他 }; 模板 结构MyTemplate { 静态常数; int myArr[arrSize];//错误C2057:应为常量表达式 //int myArr[e==FIRST?4:10];//工作正常,但可读性不强。。。 }; 模板 常量int MyTemplate::arrSize=4; 模板 常量int MyTemplate::arrSi

我想要一个数组,它的长度取决于模板的参数,但我一直得到“expected constant expression”错误

enum MyEnum
{
第一,
其他
};
模板
结构MyTemplate
{
静态常数;
int myArr[arrSize];//错误C2057:应为常量表达式
//int myArr[e==FIRST?4:10];//工作正常,但可读性不强。。。
};
模板
常量int MyTemplate::arrSize=4;
模板
常量int MyTemplate::arrSize=10;
<> >我必须使用的编译器不支持<代码> CONTXPRP>代码>,或者任何其他C++ 11特性,并且我也不能把数组大小作为模板参数传递。 编辑:我也不能使用
new


谢谢

在这种情况下,我将添加一个函数
get\u array\u size()
。既然你说你没有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];
};
//我称之为伪模板函数,但可能有更好的名称
模板结构GetArraySize//默认情况下的编译器错误
模板结构GetArraySize{static const int value=4;};
模板结构GetArraySize{static const int value=10;};
模板
结构MyTemplate
{
静态常量int arrSize=GetArraySize::value;
int myArr[arrSize];
};

在类似的情况下,我将添加一个函数
get\u array\u size()
。既然你说你没有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];
};
//我称之为伪模板函数,但可能有更好的名称
模板结构GetArraySize//默认情况下的编译器错误
模板结构GetArraySize{static const int value=4;};
模板结构GetArraySize{static const int value=10;};
模板
结构MyTemplate
{
静态常量int arrSize=GetArraySize::value;
int myArr[arrSize];
};

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

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

template<MyEnum e> 
struct MyTemplate
{
    int myArr[e];      
};
enum MyEnum
{
第一个=4,
其他=10
};
模板
结构MyTemplate
{
int myArr[e];
};

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

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

template<MyEnum e> 
struct MyTemplate
{
    int myArr[e];      
};
enum MyEnum
{
第一个=4,
其他=10
};
模板
结构MyTemplate
{
int myArr[e];
};


你不能这样做,当你声明
int myArr[arrSize]
imo,
e==FIRST时,编译器必须知道
arrSize
?4:10
比引入模板专门化更具可读性。。。使用
模板
关键字的次数越多,代码的可读性就越差is@Brian对于这个例子,但我在实际代码中有10+种可能性。你不能这样做。当你声明
int-myArr[arrSize]
imo时,编译器必须知道
arrSize
e==FIRST?4:10
比引入模板专门化更具可读性。。。使用
模板
关键字的次数越多,代码的可读性就越差is@Brian这就是这个例子,但我在真实代码中有10+的可能性。虽然我还没有弄清楚如何在
MyTemplate
中获取这个。但是我还没有弄清楚如何在
MyTemplate
中获取这个。我不能,因为枚举还有其他一些值在其他地方使用。不过,在页面上给出的答案不错,然后取该值并加上N,其中N是您想要的结果数减去该值。将枚举值映射到我想要的数组大小的函数不是线性的@菲尔:是指数型的吗?哈哈,开玩笑的人,你更清楚细节,我只是想帮你。我不能,因为枚举还有一些其他的值,可以在其他地方使用。但是,在页面上有一个不错的答案,然后取该值并加上N,其中N是您想要的结果数减去该值。将枚举值映射到我想要的数组大小的函数不是线性的@菲尔:是指数型的吗?哈哈,开玩笑吧,你更清楚细节,我只是想帮你。