是否可以从指针模板参数中提取类型?

时间:2014-04-23 00:28:44

标签: c++ templates template-meta-programming

是否可以定义一个采用单个指针参数的模板并提取指向?

的类型
extern int three = 3;
typename examine<&three>::pointed_type // int

2 个答案:

答案 0 :(得分:2)

您可以使用std::remove_pointer<T>::type(C ++ 11)中的<type_traits>

答案 1 :(得分: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参数(或将其限制为{{} 1}},这根本没有帮助。如果未执行此操作,则在定义模板参数int*时,名称T不是任何类型的名称。

根本不可能对p执行任何类型的自动演绎,因为这需要以其他顺序定义模板参数。

在不使用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*> 之前,你无法使用它来解决定义T的限制,因为模板参数推导只会推导出你传递的那些模板参数右侧的任何类型。