2014-04-23 90 views
0

是否可以定義一個模板,它只需要一個指針參數並提取指向的類型?是否可以從指針模板參數中提取類型?

extern int three = 3; 
typename examine<&three>::pointed_type // int 
+0

['pointer_traits :: element_type'](http://en.cppreference.com/w/cpp/memory/pointer_traits) – Praetorian

+1

請參閱http://stackoverflow.com/questions/5628121 – Oktalist

回答

2

有已經在<type_traits>(C++ 11)std::remove_pointer<T>::type,您可以使用。

+0

這將無濟於事在這種情況下 - 我想傳遞一個指針作爲模板參數,而不是一個類型。 – Kietz

+0

使用'decltype(&three)'代替然後:'remove_pointer :: type' – zneak

1

是的,你可以使用偏特化來實現這一點,類似以下內容:

template<typename T> 
struct examine { 
    typedef T pointed_type; 
}; 

template<typename T> 
struct examine<T*> { 
    typedef T pointed_type; 
}; 

要引用您的關於非類型模板參數使用提示,考慮以下因素:

template<typename T, T* p> 
struct foo { }; 

extern int three = 3; 
foo<decltype(three), &three> bar; 

如您所見,foo確實可以採用&x的模板參數,但要這樣做,我們首先需要給它一個type參數(或將其限制爲int*,這對於al L)。如果未完成,則在定義模板參數p時名稱T不是任何類型的名稱。

完全沒有辦法執行任何類型的自動扣除T,因爲這需要以其他順序定義模板參數。

你可以不使用decltype最接近的是通過定義一個函數模板得到一個非模板參數,將導致模板類型參數中,像這樣

template<typename T> 
void deduce_argument_type(T const&) 
{ 
    // here, the type T is (close to) that of your argument 
} 
deduce_argument_type(&three); // uses deduce_argument_type<int*> 

再次演繹,您不能使用此以避免在通過&three之前定義T的限制,因爲模板參數推導只會推導出您傳遞的模板參數右側的任何類型。

+0

這給了我一個'錯誤:模板參數列表中的參數1的類型/值不匹配'模板 struct examine'' 。 – Kietz

+1

您不能將值用作類型。因此,將尖括號中的'&3'放在任何情況下都是錯誤的。如果你想這樣做,你需要使用C++ 11'decltype',或者使用函數模板並將'&three'傳遞給它,以便將它的參數類型推導爲'int *'。 –

+0

C++允許[非類型模板參數。](http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fnon -type_template_parameters.htm) – Kietz

相關問題