2012-01-08 71 views
2

我「米試圖找到一種方法來判斷一個類型是在編譯時的指針是這樣的:檢查在編譯的時候,如果類型爲指針

#include <type_traits> 
#if std::is_pointer<char*>::value 
#pragma message("blah") 
#endif 

然而,這給」警告C4067:預處理器指令後的意外令牌 - 期待換行符「兩次(我認爲::是什麼讓它混淆了),它不打印等等,當hoover over :: value時,編譯器告訴我它是否爲真,這意味着它是已知在編譯時間所以這應該工作

這是因爲我想能夠做這樣的事情:

T pHead; 
#if std::is_pointer<T>::value 
pHead= NULL; 
#endif 

其中,如果它是指針,則爲NULL。它必須是編譯時檢查,因爲如果T是一個結構體,我不能將NULL賦值給它的變量。即下面的代碼將不能編譯當T是一個結構:

T pHead; 
if (std::is_pointer<T>::value) 
    pHead= NULL; 

感謝
馬特

回答

4

您可以將變量初始化爲它的默認值,對於指針類型它是NULL。

T pHead = T(); 

適用於大多數結構。

+0

我覺得'T'是一個通用的。我懷疑這會起作用。如果'T'是'int *'呢? – 2012-01-08 11:30:52

+0

我將T看作模板參數或typedef。如果是的話,它會起作用。如果它實際上是'int *',我們知道它是一個指針,可以將它設置爲NULL。 – 2012-01-08 11:34:10

+0

@Matt - 如果你有'typedef int * T;'它*不工作。像結構或模板參數一樣。 – 2012-01-08 12:05:21

3

您可以使用模板此:

template<typename A> 
void foo(A a) 
{ 

} 

template<typename A> 
void foo(A*& a) 
{ 
    a = NULL; 
} 

調用foo的指針類型將進入第二個功能,否則是第一個功能。

你不能用預處理指令來做,因爲顧名思義,這是在編譯之前發生的。

但是在編譯期間會發生模板分辨率,所以您可以使用此解決方案。

我假設你已經在使用的模板,因爲你的代碼還提供了一個泛型類型:

T pHead; 
#if std::is_pointer<T>::value 
pHead= NULL; 
#endif 

你可以使用

T pHead; 
foo(pHead); 
+0

或者他可以使用[boost :: is_pointer](http://www.boost.org/doc/libs/1_48_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html)。 – elmo 2012-01-08 11:34:48

+0

它應該是'void foo(A *&a)'。 – 2012-01-08 11:35:44

+0

@GeorgFritzsche你是對的,我編輯了我的答案。謝謝! – 2012-01-08 11:37:30