You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:48:02