是否可以定義一個模板,它只需要一個指針參數並提取指向的類型?是否可以從指針模板參數中提取類型?
extern int three = 3;
typename examine<&three>::pointed_type // int
是否可以定義一個模板,它只需要一個指針參數並提取指向的類型?是否可以從指針模板參數中提取類型?
extern int three = 3;
typename examine<&three>::pointed_type // int
是的,你可以使用偏特化來實現這一點,類似以下內容:
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
的限制,因爲模板參數推導只會推導出您傳遞的模板參數右側的任何類型。
這給了我一個'錯誤:模板參數列表中的參數1的類型/值不匹配'模板
您不能將值用作類型。因此,將尖括號中的'&3'放在任何情況下都是錯誤的。如果你想這樣做,你需要使用C++ 11'decltype',或者使用函數模板並將'&three'傳遞給它,以便將它的參數類型推導爲'int *'。 –
C++允許[非類型模板參數。](http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fnon -type_template_parameters.htm) – Kietz
['pointer_traits :: element_type'](http://en.cppreference.com/w/cpp/memory/pointer_traits) –
Praetorian
請參閱http://stackoverflow.com/questions/5628121 – Oktalist