首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >怎么才能做到这种自动?

问怎么才能做到这种自动?
EN

Stack Overflow用户
提问于 2010-11-07 10:45:57
回答 2查看 309关注 0票数 0

对所有派生类都有自动执行此操作的方法吗?我不需要为所有嵌套类创建函数applyPack。

这是我代码的一部分:

代码语言:javascript
复制
/** 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>()); };
};

我读过一些关于类型特征的文章,但是我不想让类对象模板化。这可以用c++和模板类TemplatesPack或c++0x中的某些函数来完成吗?S

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-07 10:50:38

编辑:

更改答案,使对象不受影响。

代码语言:javascript
复制
template<class T>
class Base<T> : public Object
{
public:
    virtual void applyPack(TemplatePack *p) { this->setTemplate(p->get<T>()); };
};

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

编辑:对于Object4的情况,以下可能会有所帮助:

代码语言:javascript
复制
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> { /* ... */ };
票数 5
EN

Stack Overflow用户

发布于 2010-11-07 11:05:35

如果不想临时使用Base,则可以使用虚拟继承和主导规则

代码语言:javascript
复制
template<typename Derived, typename Base = void>
struct applyer : virtual applyer<Base, typename Base::base_type> {
  virtual void applyPack(TemplatesPack *p) { 
    dynamic_cast<Derived*>(this)->setTemplate(p->get<Derived>()); 
  };

  typedef Base base_type;
};

template<typename Derived>
struct applyer<Derived, void> {
  virtual void applyPack(TemplatesPack *p) { 
    dynamic_cast<Derived*>(this)->setTemplate(p->get<Derived>()); 
  };
};

现在您可以这样做了

代码语言:javascript
复制
class Object : virtual public applyer<Object> {

};

class Object2: public Object, virtual public applyer<Object2, Object> {

};

class Object3: public Object, virtual public applyer<Object3, Object>  {

};

第二个参数分别是直接基类,如果没有,可以省略它。例如,如果您是从Object3派生的,您需要这样做:

代码语言:javascript
复制
class Object3_1: public Object3, virtual public applyer<Object3_1, Object3>  {

};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4117362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档