如何从类的实例中获取该类的类型?
从类实例中获取类类型的正确做法
你想从类的对象实例中获取该类的类型是可行的,但你提供的代码写法存在错误——C++函数不能直接返回类型本身,只能返回该类型的对象、或者通过编译期特性推导类型。
原代码的问题
你的getSelfType函数试图返回ClassType(即A<T>类型),这是不合法的,因为函数返回值必须是一个值,而不是类型。
几种正确实现方式
方式1:直接用decltype推导对象类型
不需要修改类,直接在使用处通过decltype获取对象的类型:
template <class T> class A { public: static int value; }; template <class T> int A<T>::value = 0; // 必须定义静态成员 int main(int argc, char** argv){ A<int> j; decltype(j)::value = 12; // 直接用decltype获取j的类型 return 0; }
方式2:通过成员函数返回类型实例,再推导类型
如果希望通过类的成员函数来提供类型入口,可以让函数返回该类型的临时对象,再用decltype推导:
template <class T> class A { public: static int value; using ClassType = A<T>; ClassType getSelfType() { return ClassType{}; // 返回该类型的临时对象 } }; template <class T> int A<T>::value = 0; int main(int argc, char** argv){ A<int> j; decltype(j.getSelfType())::value = 12; // 推导返回值的类型 return 0; }
方式3:使用编译期类型标识(C++11及以上)
还可以定义一个空的标签结构体,用来传递类型信息,避免创建对象:
template <class T> class A { public: static int value; using ClassType = A<T>; struct TypeTag {}; TypeTag getSelfType() const { return {}; } }; template <class T> int A<T>::value = 0; int main(int argc, char** argv){ A<int> j; using MyType = typename decltype(j.getSelfType())::ClassType; MyType::value = 12; return 0; }
注意:所有静态成员变量必须在类外进行定义,否则会出现链接错误,上面的示例都补充了这一点。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

