3

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

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

在其他地方我看到了一种延迟类型

typedef MyClass<int>* param_type;

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

我能以某种方式MyClass<int>::inferred_type从那个指针 typedef 得到吗?

编辑

关于RiaD的回答,以下行可以满足我的需要:

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

请注意,在我在那里看到的上下文中,它本身是一个模板参数,typename因此只需要它。param_type

4

3 回答 3

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

于 2013-07-15T00:38:19.183 回答
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
于 2013-07-15T00:38:11.353 回答
1

您可以尝试使用iterator_traits

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

之后,您可以再写value_type一次以获得int.

它将与指针和标准迭代器一起使用。

于 2013-07-15T00:43:22.317 回答