0

我想要这样的东西:

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

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

4

3 回答 3

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>();
}
于 2013-10-29T21:38:27.990 回答
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;
}

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

于 2013-10-29T21:34:52.223 回答
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;
}
于 2013-10-29T21:39:23.863 回答