Я должен признать: макросы могут быть веселыми. Мы все должны знать, что их следует избегать. Хотя, поскольку это упражнение о макросах, мы можем обсудить, использовать макрос или нет.
Смысл упражнения в том, что вы не можете (напрямую) включить std::string
. Этот ответ показывает, как можно обойти это ограничение. Необходимый для написания чрезвычайно подробного повторяющегося кода макрос оправдан. Для полноты картины я хочу добавить, как это можно решить, используя ваш оригинальный подход, используя серию if
вместо switch
.
Во-первых, я пишу функцию, которая выполняет то, что запрашивается, без какого-либо макроса:
int foo(std::string tag)
{
std::string& temp = tag;
{
if (temp == "a")
{
return 1;
}
if (temp == "b")
{
return 2;
}
if (temp == "abc")
{
return 3;
}
{
return -1;
}
}
}
Это не очень хорошо, что он использует if
s, а не else if
, что должно быть предпочтительнее для взаимоисключающих случаев. Однако, как и в каждом случае return
s, результат не будет отличаться (если это не так, вам придется добавить goto
vodoo, как указано в другом ответе). Имея это, легко увидеть, какие макросы нужны:
#define SWITCH_STRING(tag) std::string& temp = tag;
#define STRING_CASE(X) if (temp == #X)
#define STRING_ELSE
Этот тип ответа на ваш вопрос о том, как использовать параметр одного макроса во втором: вы этого не делаете. Вместо этого вы можете использовать ссылку, имя которой больше не зависит от фактического имени tag
.
Полный пример