C++;宏连接 我对C++宏连接有点麻烦。
目前,我有许多类共享同名的静态函数。例如:C++;宏连接 我对C++宏连接有点麻烦。,c++,macros,concatenation,C++,Macros,Concatenation,目前,我有许多类共享同名的静态函数。例如: 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, 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();
}
}
}
我有一个接口,用于根据类型调用静态函数。例如:
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
语句和类型代码重新实现了虚拟函数调度?我有充分的理由使用这种设计,并且上下文与问题完全无关,这就是为什么我简化了使用此示例的原因。我不喜欢使用宏,尤其是以这种方式。必须有更好的方法,比如模板或设计变更。宏是邪恶的。我添加了中断,我猜这是你的初衷。