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
语句和类型代码重新实现了虚拟函数调度?我有充分的理由使用这种设计,并且上下文与问题完全无关,这就是为什么我简化了使用此示例的原因。我不喜欢使用宏,尤其是以这种方式。必须有更好的方法,比如模板或设计变更。宏是邪恶的。我添加了中断,我猜这是你的初衷。