2012-04-21 82 views
1

是否有相當於一個typedef到:如何將C++宏轉換爲typedefs?

#define HashTabOf(i) htab[i] 

#define MAXCODE(n_bits) (((code_int) 1 << (n_bits)) - 1) 

該代碼正在從C移植到C++。

+4

這些都沒有定義一個類型,所以爲什麼會有他們的'typedef'? – 2012-04-21 12:47:41

+1

即時通訊不知道:(我真的很困惑,將它們轉換爲函數更好嗎?還是完全錯誤? – 2012-04-21 12:49:14

+1

功能是完全正確的。 – juanchopanza 2012-04-21 12:51:19

回答

4

不是的typedef,但是C++的方法是:

template <typename T> 
inline T &HashTabOf(size_t i) 
{ 
    return htab[i]; 
} 

inline size_t MAXCODE(size_t n_bits) 
{ 
    return (1 << n_bits) - 1; 
} 
+0

好吧,似乎沒有工作。我不大聲地使用模板這個任務,但有一個功能,我可以用 – 2012-04-21 12:52:50

+2

替換它第一個可能很煩人,因爲編譯器不能自動推斷出模板參數 – 2012-04-21 12:57:01

+0

@OliCharlesworth:這就是爲什麼我提出了另一種解決方案。 – Nawaz 2012-04-21 12:59:04

3

我會實現@達尼的模板解決方案爲:

inline auto & HashTabOf(size_t i) -> decltype(htab[0]) 
{ 
    return htab[i]; 
} 

它只有在C是有效的++ 11。它使用由C++ 11引入的名爲trailing-return-type的功能。

這個解決方案的好處是,它不再是一個模板。你並不需要提及T當您使用它,而在@達尼的解決方案就不得不提到T還有:

auto item = HashTabOf<Type>(4); //Dani's solution 
auto item = HashTabOf(4);  //My solution 

是的,你可以簡單地寫:

inline int & HashofTable(size_t i) 
{ 
    return htab[i]; 
} 

另外,爲什麼不直接使用htab[i]

+0

對不起,這個模板的東西不適合我。 有沒有簡單的方法爲此我希望更多... int HashofTable(i){ return htab [i]; } – 2012-04-21 13:00:09

+2

@DanielDC:如果您不被允許使用模板,那是一回事,但是說*「這個模板的東西不起作用」*是另一回事。此外,此解決方案不使用模板。這是一個非模板解決方案。 – Nawaz 2012-04-21 13:01:30

+0

在這一點上,我並不真正知道模板是什麼,所以不要把它放在心上。 – 2012-04-21 13:03:08