C++11中能否解引用类指针类型别名提取类静态常量值
问题解答
原生语法限制
直接写T2::BAR无法通过编译是符合C++规则的:T2本质是Foo*(指向Foo类的指针类型)的别名,指针不属于类类型,不支持通过::作用域解析符访问类的静态成员,没有任何原生语法可以直接通过指针别名取到类的静态常量值。
C++11兼容的实现路径
如果需要从T2中提取BAR的值,完全可以通过编译期类型萃取机制实现,无额外运行时开销:
- 引入C++11标准库提供的类型萃取头文件:
#include <type_traits> - 用
std::remove_pointer模板剥离T2的指针修饰,拿到底层的Foo类类型后再访问静态成员,完整可编译的写法为:int value2 = std::remove_pointer<T2>::type::BAR;
该逻辑的本质是在编译期把T2推导为去掉指针属性的原始类型Foo,后续的访问逻辑和你直接写T1::BAR完全一致,不存在语法问题。 - 如果不想依赖标准库工具,也可以手写偏特化模板实现相同功能,完全适配C++11标准:
调用方式为:// 通用模板:匹配非指针类型 template <typename T> struct GetBaseType { using type = T; }; // 偏特化规则:匹配指针类型,返回指向的原始类型 template <typename T> struct GetBaseType<T*> { using type = T; };int value2 = GetBaseType<T2>::type::BAR;
注意事项
- 上述操作是C++模板元编程的常规实现,不属于不良编程实践:所有类型推导都在编译期完成,没有运行时成本,只要你定义类型别名时语义统一,不存在难以维护的问题。
- 上述萃取逻辑仅支持单层指针,如果T2定义为多级指针(如
Foo**),需要连续调用多次std::remove_pointer(或自定义模板)才能拿到最终的类类型。 - 你代码中类内初始化的
static const int BAR = 2符合C++11的语法规则,只要不对该静态成员做取地址、绑定非常量引用的操作,不需要在类外补充独立定义即可正常使用。
内容的提问来源于stack exchange,提问作者Coded Designer
相关产品推荐
相关产品推荐

