Я пытаюсь построить динамическую строку из переменной счетчика в цикле в 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 ++ Получить по индексу
Трудно сказать, что ты пытаешься сделать. Но я предполагаю, что у вас есть что-то вроде 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>
или большое заявление переключателя.
Вы можете использовать что-то вроде
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
..