2014-04-23 67 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

相关问题