我尝试在c ++中使用循环中的计数器变量构建动态字符串,我正在考虑简单的macro
。
类似这样的事情:
// its enum element string LOCAL_1, LOCAL_2 .....
#define CREATE_STR(N) LOCAL_##N
int ii =1;
for(;ii<=COLS_NUMBERS_PER_WINDOW;)
{
pGameObj->IniGameObj(pMainWindowObjCenter,
CREATE_STR(ii),
Z,
ii);
GameVector.push_back(pGameObj);
ii++;
}
但是它给了我编译器错误
error C2065: 'LOCAL_ii' : undeclared identifier
还有其他好方法可以从动态变量构建动态字符串吗?我可以使用c ++ 11。
更新
我想我只需要这个:
Enum C++ Get by Index
答案 0 :(得分:4)
很难说出你想要做什么。但我猜你有类似enum { LOCAL_1, LOCAL_2, ...
的内容,并且想要将ii
转换为这些符号。
你绝对不能用预处理器做到这一点。 ii
的值在编译时甚至都不知道,并且因为预处理器甚至在此之前发生,所以你能做的最好的是简单的文本替换,这使得不可能使用ii
作为改变表达你想要的。
你必须在运行时进行扩展,比如@ Jarod42建议("LOCAL_" + std::to_string(ii)
),但是你留下了一个字符串。在运行时,编译器已经忘记了LOCAL_1
等符号。
回到方阵1,如何将ii
转换为LOCAL_xx
?我建议如下:
如果LOCAL_xx
是枚举,则只需将枚举常量指定给要从ii
转换的值。
enum {
LOCAL_1 = 1,
LOCAL_2 = 2,
};
现在,ii
和LOCAL_xxx
之间基本没有区别。不需要转换。
如果LOCAL_xx
不是整数常量,那么您需要自己构建映射。例如,使用std::map<int, LOCAL_xxx>
或大转换语句。
答案 1 :(得分:0)
您可以使用类似
的内容const GameObjectTypeLocation locals[COLS_NUMBERS_PER_WINDOW] = {
LOCAL_1, LOCAL_2, LOCAL_3
};
for (int ii = 1; ii <= COLS_NUMBERS_PER_WINDOW; ++ii)
{
pGameObj->IniGameObj(pMainWindowObjCenter, locals[ii - 1], Z, ii);
GameVector.push_back(pGameObj);
}
如果LOCAL_1
,LOCAL_2
遵循逻辑,您可以直接将int
转换为enum
。
for (int ii = 1; ii <= COLS_NUMBERS_PER_WINDOW; ++ii)
{
// Assuming LOCAL_1 = 0, LOCAL_2 = 1, ...
pGameObj->IniGameObj(pMainWindowObjCenter, GameObjectTypeLocation(ii - 1), Z, ii);
GameVector.push_back(pGameObj);
}
作为说明,附:
enum GameObjectTypeLocation { LOCAL_1, LOCAL_2};
LOCAL_1
为0
,LOCAL_2
为1
,..