C++泛型Lambda中如何便捷获取引用型参数的嵌套类型?
泛型Lambda中获取嵌套类型的简化写法
给定嵌套类型定义:
struct mytype { using mynestedtype = int; }; mytype value; mytype& ref2value = value;
在泛型Lambda中,确实有比typename std::remove_reference<decltype(x)>::type::mynestedtype更简洁的写法,以下是几种实用方案:
1. C++14及以上:用_t后缀类型别名简化
C++14为标准库类型萃取新增了_t后缀的别名模板,可直接替代::type的冗长写法:
auto mylambda = [](auto& x){ typename std::remove_reference_t<decltype(x)>::mynestedtype y; //... }; mylambda(ref2value);
如果需要同时移除const/volatile限定,可以改用std::decay_t<decltype(x)>,等价于std::remove_cv_t<std::remove_reference_t<decltype(x)>>。
2. 提前定义局部类型别名(适合多次引用场景)
如果Lambda内部需要多次使用该嵌套类型,可先定义局部类型别名,后续直接复用:
auto mylambda = [](auto& x){ using T = std::remove_reference_t<decltype(x)>; T::mynestedtype y; T::mynestedtype z; // 后续直接用T::即可 //... };
3. 自定义简易类型萃取(全局复用)
如果项目中频繁需要这类操作,可以自己封装更短的类型别名:
template<typename T> using remove_ref_t = std::remove_reference_t<T>; // 在Lambda中使用: auto mylambda = [](auto& x){ typename remove_ref_t<decltype(x)>::mynestedtype y; //... };
需要说明的是,你期望的x::mynestedtype和decltype(x)::mynestedtype确实不合法:前者是因为x是对象而非类型,后者是因为decltype(x)是带引用的类型,引用本身没有嵌套成员,必须先移除引用才能访问原类型的嵌套定义。
内容的提问来源于stack exchange,提问作者Nicolò Tosi
相关产品推荐
相关产品推荐

