2014-12-05 58 views
0

我在理解C++宏連接方面有點麻煩。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](http://stackoverflow.com/help/mcve),其中包含精確的編譯器錯誤。 – chris 2014-12-05 02:14:10

+0

你爲什麼要這樣做?你基本上已經用'switch'語句和類型代碼重新實現了虛函數調度? – b4hand 2014-12-05 02:20:13

+0

我有采用這種設計很好的理由和背景是完全不相干的問題,這就是爲什麼我一直在使用這個例子簡化。 – 2014-12-05 02:23:29

回答

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

我增加了休息時間,我猜這是你的第一意圖。 – 2014-12-05 03:08:16