2012-05-10 77 views
2

是否有可能這樣做模板在C++中的宏?

# define abc<T1> __abc<T1, T2> 

template<typename T2> void somefun() { 
    ... 
    abc<int>(...); 
    abc<double>(...); 
    ... 
} 

只是爲了不每次我打電話ABC

+4

(注意'__abc是保留的) – Flexo

+1

不要使用宏來滿足你的懶惰。他們只是讓你的程序成爲一個真正的婊子來維護。 –

回答

7

在C++ 11的時間,你可以做寫:

template<typename T2> void somefun() { 
    template <typename T> 
    using abc = __abc<T, T2>; 
} 

如果沒有,你可以使用一個宏,但你需要做的:

#define abc(T1) __abc<T1, T2> 

//usage: 

abc(Type) instance; 

但因爲這看起來不是很自然,我會避免它親自。

如果你想避免宏觀預C++ 11,你可以這樣做:

template <typename T2> 
struct type { 
    template <typename T1> 
    struct lookup { 
    typedef __abc<T1,T2> type; 
    }; 
}; 

template <typename T2> void somefun() { 
    typedef type<T2> abc; 
    typename abc::template lookup<int>::type(); 
} 

但是捫心自問這甚至比宏觀情況下的可讀性

(注:__abc保留)

+1

我不會使用宏,完整地輸入它。它看起來不自然,當它變老時會混淆他人和你自己。此外,它存在於頭文件中,可能會導致頭部代碼出現問題。 – Beached

2

是的,但你需要使用圓括號。

# define abc(T1) __abc<T1, T2> 

template<typename T2> void somefun() { 
    ... 
    abc(int)(...); 
    abc(double)(...); 
} 

編輯:我的建議是不使用這種縮寫的宏。使用awoodlands解決方案或者可能是默認的模板參數。你不能使用保留的名字。

+1

有趣的,它的工作原理,但使代碼棘手和難以理解,因爲它看起來像C風格鑄造:) – user1386738

+0

你問了它,並得到它;-) – hirschhornsalz

+1

@ user1386738:「它的工作,但使代碼棘手和難以理解「適用於大多數(如果不是全部)宏。 – MSalters