假设我有一个这样的类模板:
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
,在我看到的上下文中。
答案 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
。
它可以使用指针和标准迭代器。