C++如何将类成员指针类型转换为对应的普通类型
解决方案
你可以通过编译期类型萃取的方式提取成员指针指向的成员类型,全程不需要类实例,也不需要用到.*运算符,完全满足初始化列表的使用场景。
方案1:C++20 及以上标准
标准库已经提供了现成的工具std::remove_member_pointer_t,可以直接组合使用:
// 替换括号内为你原来的decltype表达式即可 using ResultType = std::remove_member_pointer_t<std::remove_reference_t<decltype(你的原表达式)>>; // 此时ResultType就是你需要的QString类型
方案2:兼容 C++11/14/17 自定义实现
如果使用的标准版本低于C++20,可以自己实现一个简单的类型萃取模板,代码量极少:
// 通用模板定义 template <typename T> struct remove_member_pointer { using type = T; }; // 针对成员指针类型的偏特化:自动匹配所有「成员类型T 所属类C::*」格式的类型 template <typename T, typename C> struct remove_member_pointer<T C::*> { using type = T; }; // 便捷别名模板(C++11及以上支持) template <typename T> using remove_member_pointer_t = typename remove_member_pointer<T>::type;
实现完成后用法和标准库工具完全一致:
using ResultType = remove_member_pointer_t<std::remove_reference_t<decltype(你的原表达式)>>; // 得到的ResultType即为QString
实现原理
该方案依赖C++模板偏特化的编译期匹配规则:只要传入的类型是成员指针格式,就会命中偏特化分支,自动提取出成员对应的原始类型,所有运算都在编译期完成,没有任何运行时依赖。
内容的提问来源于stack exchange,提问作者LightSith
相关产品推荐
相关产品推荐

