У меня возникли проблемы с пониманием c++ конкатенации макросов.
В настоящее время у меня есть много классов, которые совместно используют статические функции с одинаковым именем. Например:
ClassA::MyFunc1, ClassA::MyFunc2, ClassA::MyFunc3
ClassB::MyFunc1, ClassB::MyFunc2, ClassB::MyFunc3
ClassC::MyFunc1, ClassC::MyFunc2, ClassC::MyFunc3
У меня есть один интерфейс, который используется для вызова статической функции на основе типа. Например:
ClassInterface::MyFunc1(Type)
{
switch (Type)
{
case TypeA:
{
ClassA::MyFunc1();
}
case TypeB:
{
ClassB::MyFunc1();
}
case TypeC:
{
ClassC::MyFunc1();
}
}
}
Таким образом, для вызова MyFunc1 по типу через один интерфейс. Поэтому, очевидно, что если у меня есть 50 классов и 50 статических функций, это будет разочаровывать их каждый раз.
Я пытаюсь написать макрос, чтобы сэкономить много времени.
#define MyMacro(x) \
case TypeA: \
{ \
ClassA::##x; \
} \
\
case TypeB: \
{ \
ClassB::##x; \
} \
\
case TypeC: \
{ \
ClassC::##x; \
}
Затем используйте его так:
ClassInterface::MyFunc1(Type)
{
switch (Type)
{
MyMacro(MyFunc1)
}
}
Тем не менее, я получаю сообщение о том, что x (внутри макроса) является необъявленным идентификатором. Может ли кто-нибудь дать мне руку здесь?
Использование Visual Studio 2013...
ошибка C2065: 'x': необъявленный идентификатор
ошибка C2143: синтаксическая ошибка: отсутствует ';' перед "случаем"
ошибка C2039: 'x': не является членом класса ClassA,
ошибка C2039: 'x': не является членом класса ClassB,
ошибка C2039: 'x': не является членом класса ClassC,
Не нужно использовать оператор concat, также вы фактически не вызываете функции.
Измените свой макрос на следующее:
//EDIT: you probably want some breaks in there
// otherwise it could call all 3 functions
#define MyMacro(x) \
case TypeA: \
{ \
ClassA::x(); \
break; \
} \
\
case TypeB: \
{ \
ClassB::x(); \
break; \
} \
\
case TypeC: \
{ \
ClassC::x(); \
break; \
}
switch
и коды типов?