返回类的类型而不是对象

时间:2013-10-29 21:29:00

标签: c++ return

我想要这样的事情:

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?
    }

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

3 个答案:

答案 0 :(得分:2)

不,C ++没有Reflection

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

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>();
}

答案 1 :(得分:1)

最接近的可能是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;
}

虽然我觉得这很奇怪,你并没有描述你真正的问题。

答案 2 :(得分:0)

您可以定义标记以标识类类型:

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;
}