С ++ Макрос Конкатенация

0

У меня возникли проблемы с пониманием 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,

  • 0
    Пожалуйста, не давайте разные блоки кода с описанием ошибки. Дайте солидный, полный MCVE с точными ошибками компилятора.
  • 0
    Зачем ты это делаешь? Вы в основном переопределили виртуальную диспетчеризацию функций, используя оператор switch и коды типов?
Показать ещё 2 комментария
Теги:
concatenation
macros

1 ответ

1
Лучший ответ

Не нужно использовать оператор 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;          \
}     
  • 0
    Я добавил перерывы, я думаю, это было ваше намерение в первую очередь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню