C++中是否可从局部变量所属类提取static member type静态成员类型
可行实现方案
完全可以实现该需求,C++11及更高版本标准提供的decltype关键字即可解决这个问题。
你写的a::constituent_type写法不成立的核心原因是:a是类的实例对象而非类型,作用域解析符::只能用于类型/命名空间层面的成员访问,需要先推导得到a对应的类型再访问嵌套的静态成员类型。
修正后的代码示例
将你标注的代码行修改为如下写法即可正常运行:
std::max<typename decltype(a)::constituent_type>(a, a);
语法说明
decltype(a)会在编译期推导得到变量a的完整类型(也就是类A),推导过程没有运行时开销,也不需要你手动记忆变量的原始类型- 前缀的
typename是必须标注的:因为decltype(a)::constituent_type属于依赖推导类型的嵌套类型,编译器需要显式标记该标识符是类型而非静态成员变量,否则会报编译错误
简化使用方案
如果这类嵌套类型访问的场景很多,可以自定义别名模板减少重复代码:
// 全局定义辅助别名模板 template<typename T> using constituent_type_t = typename T::constituent_type; // 使用时写法更简洁 std::max<constituent_type_t<decltype(a)>>(a, a);
该特性兼容性极佳,所有主流C++编译器(GCC 4.8+、Clang 3.3+、MSVC 2012+)都已完整支持。
内容的提问来源于stack exchange,提问作者mzoll
相关产品推荐
相关产品推荐

