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

如何从类的实例中获取该类的类型?

从类实例中获取类类型的正确做法

你想从类的对象实例中获取该类的类型是可行的,但你提供的代码写法存在错误——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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:15:01