我有一个从函数返回的复杂模板类型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<..>*
吗?
答案 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