是否可以定义一个模板,它只需要一个指针参数并提取指向的类型?是否可以从指针模板参数中提取类型?
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