从匿名指针类型中检索内部类型

时间:2014-07-17 09:29:55

标签: c++ templates pointers c++11 typetraits

我有一个从函数返回的复杂模板类型X<..>*(它是一个大型模板类型,长度超过200个字符,所以我绝不想写它)。在这个复杂的类型中,有一个我想要检索的类型Y

// The template type with inner type
template<typename T>
struct X{
   typedef ... Y;
};

// The function returning a pointer to a very long instanication of X
X<...>* foo(){}

我正在使用auto来处理这个long类型,并希望使用decltype来获取内部类型,如下所示:

int main(){
   auto t = foo(); 
   decltype(*t)::Y y; // This variable should be of the inner type
}

但是,这不起作用,因为评估*t会产生类型X<...>&而不是X<...>,因此我无法在引用上使用范围解析::Y。那么如何轻松删除引用以便我可以访问内部类型。我知道std::remove_reference,我可以写下以下内容:

std::remove_reference<decltype(*t)>::type::Y y;

然而,这将经常使用,并且我不想过度使用这种长类型特征来混乱我的代码。因为我有一个指针类型Y的变量,所以有一种以更短的方式访问内部类型X<..>*吗?

2 个答案:

答案 0 :(得分:3)

使用:

template <typename T>
using MyY = typename std::remove_reference<T>::type::Y;
你可以做

MyY<decltype(*t)> y;

答案 1 :(得分:1)

如果向模板添加了返回类型为foobar的成员函数Y,则可以使用:

decltype(t->foobar()) y