返回类的类型而不是对象的类型

return the type of a class instead of an object

本文关键字:类型 对象 返回      更新时间:2023-10-16

>我想要这样的东西:

class* defineType(ofxDTangible &t) {
    if(t.angle > PI) {
        return STSequencer;
    }
    else if(t.angle > HALF_PI) {
        return STSample;
    }
    return NULL;
}

所以我不想返回类类型的对象,而是返回类本身的类型。可能吗?

我想要的是这样的东西:

    classType = defineType(tang);
    if(classType != NULL) {
        // create the object somehow?
    }

这可能很糟糕,但我只是想知道这是否可能。

不,C++没有反射。

但是,您可以使用多态性来解决此类问题:

class ofxDTangible
{
public:
    float angle;
};
class STbase
{
public:
    virtual ~STBase(){}
};
class STSequencer : public STbase
{
public:
    STSequencer(const ofxDTangible &ofx){ /*...*/ }
};
class STSample : public STbase
{
public:
    STSample(const ofxDTangible &ofx){ /*...*/ }
};
shared_ptr<STbase> defineType(ofxDTangible &t)
{
    if(t.angle > PI) {
        return shared_ptr<STbase>(new STSequencer(t));
    }
    else if(t.angle > HALF_PI) {
        return shared_ptr<STbase>(new STSample(t));
    }
    return shared_ptr<STbase>();
}

你能得到的最接近的可能是std::type_info

const std::type_info* defineType(ofxDTangible &t) {
    if(t.angle > PI) {
        return &typeid(STSequencer);
    }
    else if(t.angle > HALF_PI) {
        return &typeid(STSample);
    }
    return NULL;
}

虽然我认为这真的很奇怪,你没有描述你的真正问题。

您可以定义一个标签来标识类类型:

enum class tag { null, sequencer, sample };
tag defineType(ofxDTangible &t) {
  if(t.angle > PI)
    return tag::sequencer;
  if(t.angle > HALF_PI)
    return tag::sample;
  return tag::null;
}