如何从给定(延迟)指针类型访问类型特征?

时间:2013-07-15 00:23:36

标签: c++

假设我有一个这样的类模板:

template<typename T>
struct MyClass
{
    typedef T inferred_type;
};

在其他地方,我看到了延迟类型的

typedef MyClass<int>* param_type;

但是MyClass<int>*被推迟了,我不知道int在这里用于实例化。我实际上正在访问MyClass<int>*的另一个typedef。

我可以以某种方式从指针typedef到达MyClass<int>::inferred_type吗?

编辑

关于RiaD的回答,以下行符合我的要求:

typedef typename std::iterator_traits<param_type>::value_type::inferred_type TheDecucedInferredType;

请注意,只有typename本身是模板参数才需要param_type,在我看到的上下文中。

3 个答案:

答案 0 :(得分:2)

您可以使用“类型函数”:

template<typename T> struct remove_pointer { typedef T type; };
template<typename T> struct remove_pointer<T*> { typedef T type; };

然后,如果ptrtype是你的指针typedef(或模板参数,或其他),你可以写

MyClass<remove_pointer<ptrtype>::type>::value_type

C ++ 11方便地预定义了remove_pointer这样的模板。

答案 1 :(得分:1)

在C ++ 11中,只有MyClass定义可见时才能显示

typedef MyClass<int>* type;

std::remove_reference<decltype(*std::declval<type>())>::type::value_type

没有C ++ 11,你可以做到

template<typename T>
struct get_value_type;

template<typename T>
struct get_value_type<T*>
{
    typedef typename T::value_type value_type;
};

typedef MyClass<int>* type;
get_value_type<type>::value_type

答案 2 :(得分:1)

您可以尝试使用iterator_traits

typename std::iterator_traits<Pointer>::value_type //if Pointer is MyClass<int>*, then it will be MyClass<int>

之后,您可以再次撰写value_type来获取int

它可以使用指针和标准迭代器。