怎么能自动完成?

kra*_*mir 0 c++ templates c++11

有没有办法自动为所有派生类执行此操作,我不必为所有嵌套类创建函数applyPack.

这是我的代码:

/** every class has registered id with this function */
template<typename T>
uint getID() {
    static uint id = registerClass<T>();
    return id;
}

class TemplatesPack {
public:
    template<typename T>
    typename T::Template get();
};

class Object {
public:
    virtual void applyPack(TemplatesPack *p) { this->setTemplate(p->get<Object>()); };
};

class Object2: public Object {
public:
    void applyPack(TemplatesPack *p) { this->setTemplate(p->get<Object2>()); };
};

class Object3: public Object  {
public:
    void applyPack(TemplatesPack *p) { this->setTemplate(p->get<Object3>()); };
};

class Object4: public Object2 {
public:
    void applyPack(TemplatesPack *p) { this->setTemplate(p->get<Object4>()); };
};
Run Code Online (Sandbox Code Playgroud)

我已经阅读了关于类型特征的一些内容,但我不想让类对象模板化.可以用c ++完成,并在TemplatesPack类或c ++ 0x中模板化一些函数吗?小号

Vla*_*lad 5

编辑:
更改了答案以使对象保持不变.

template<class T>
class Base<T> : public Object
{
public:
    virtual void applyPack(TemplatePack *p) { this->setTemplate(p->get<T>()); };
};

class Object2 : public Base<Object2>
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

编辑:对于这种情况Object4,可能以下内容将有所帮助:

template<class S, class D>
class Base<S, D> : public S
{
public:
    virtual void applyPack(TemplatePack *p) { this->setTemplate(p->get<D>()); };
};

class Object2 : public Base<Object, Object2> { /* ... */ };

class Object3 : public Base<Object, Object3> { /* ... */ };

class Object4 : public Base<Object2, Object4> { /* ... */ };
Run Code Online (Sandbox Code Playgroud)