2014-10-16 4 views
-1

У меня возникает следующая проблема. Давайте предположим, что мой код выглядит, чтоПрепроцессорные макросы

#define Function1 FunctionOne 
#define Function2 FunctionTwo 
#define CALL_FUNCTION (FunctionName) \ 
     SOMEOBJ someObject.... 
     someObject->FunctionName(); 

Теперь проблема заключается в том, что я хочу, чтобы проверить, что имя функции и в зависимости от того, что я хочу использовать разные SOMEOBJ. Таким образом, для вызова

CALL_FUNCTION(Function1) 

следующий код будет называться

SOMEOBJ someObj... 
    someObj->FunctionOne(); 

но для

CALL_FUNCTION(Function2) 
    .... 
    SOMEOBJ2 someObj... 
    someObj->FunctionOne(); 
+5

Мне кажется, что макросы не правильный инструмент для этой работы. –

+0

Проблема [X-Y] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), если я когда-либо видел ее. Что вы действительно хотите сделать, чего вы пытаетесь достичь этими макросами? – Angew

+0

Держу пари, это невозможно! – 9dan

ответ

0

Прежде всего я хочу, чтобы препятствовать вам использовать мой ответ. Как и комментарии, вы, вероятно, стреляете из-за неправильного решения вашей проблемы.

В целях для обучения я хочу, чтобы предоставить вам решение макросъемки:

struct SOMEOBJ1 { 
    void FunctionOne() { std::cout << "SOMEOBJ1 FunctionOne"; } 
}; 

struct SOMEOBJ2 { 
    void FunctionTwo() { std::cout << "SOMEOBJ2 FunctionTWO"; } 
}; 

#define Function1 FunctionOne 
#define Function2 FunctionTwo 
#define CALL_FUNCTION(funcVersion) \ 
{ \ 
    SOMEOBJ ## funcVersion someobj; \ 
    someobj.Function ## funcVersion(); \ 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CALL_FUNCTION(1); 
    CALL_FUNCTION(2); 

    return 0; 
} 
Смежные вопросы