我是元编程新手,在使用选项卡时遇到了与 const 相关的问题。
假设我们有几种“类型”。每种类型都有不同的版本,我们将能够处理每种类型的所有版本。为此,我们使用一个包含有关类型的标准信息的结构,以及一个包含每个版本信息的数组。
问题是,每种类型没有相同数量的版本。另外,版本号不是很高,所以我不喜欢使用上述表的动态分配。但是如果我进行静态分配,我需要为结构的每个实例创建一个大小相同的表。这意味着,我必须获得最高版本值并将其用作数组的大小。
我来了:我想创建一个小的元编程模板,它在编译时给出最高的版本值,所以我可以有一个固定大小的数组,肯定会包含每种类型的 necerrasy 信息。但我得到一个编译错误。
这是重现问题的简化示例代码(错误随之而来)
#include <stdio.h>
// change values here
#define VERSION_ALPHA 3
#define VERSION_BETA 5
#define VERSION_GAMMA 2
// different available types
enum TYPES
{
T_ALPHA = 0,
T_BETA,
T_GAMMA,
T_COUNT, // number of types
};
// to access versions more easily from code
static const int typeVersions[T_COUNT] =
{
VERSION_ALPHA,
VERSION_BETA,
VERSION_GAMMA
};
// this meta is used to get the highest version values between all types
template<int i>
class HighestVersion
{
private:
// version of type -1
enum
{
PREVIOUS = HighestVersion<i-1>::VALUE
};
public:
// current max value
enum
{
VALUE = (typeVersions[i] > PREVIOUS ? typeVersions[i] : PREVIOUS)
};
};
// first version
template<>
class HighestVersion<0>
{
public:
// current max value
enum
{
VALUE = typeVersions[0]
};
};
// highest version macro
#define HIGHEST_VERSION HighestVersion<T_COUNT>::VALUE
// holds info about a single type
struct TypeInfo
{
char * s_pName; // name of the type as string
unsigned int s_Flags[HIGHEST_VERSION]; // flags for each available version of this type
};
int main()
{
// instanciate
TypeInfo infos[T_COUNT];
// do stuff, set name, load flags....
/*...*/
// for test purpose, print max version value (should print 5 in this situation)
printf("%d\n", HIGHEST_VERSION);
}
编译器说:
error C2057: expected constant expression
@线条
VALUE = (typeVersions[i] > PREVIOUS ? typeVersions[i] : PREVIOUS)
和
VALUE = typeVersions[0]
编译器似乎告诉我表的内容不是恒定的。我认为这是因为该表被解释为在这种情况下不是常量的指针(因此,如果指针更改,则内容不一样)。有没有办法纠正这个问题,以便我可以使用脚本?这将使用户无需手动设置该表的大小......
提前致谢 :)