【问题标题】:Is it possible to create per-instance mixins in C++11?是否可以在 C++11 中创建每个实例的 mixin?
【发布时间】:2013-07-11 19:12:11
【问题描述】:

是否可以在 C++ (C++11) 中创建 mixins - 我想为每个实例而不是每个类创建行为。

在 Scala 中,我会使用匿名类来做到这一点

val dylan = new Person with Singer

【问题讨论】:

  • 模板类是否满足您的需求?
  • 嗯。混入不是更像“通过增强另一种类型来创建新类型”。也就是说,它的行为不是针对每个实例的。
  • @lulyon 是的,取决于代码量。我想要一个简单的用法
  • 这不是装饰器模式的用例吗?
  • 装饰器是否增加和混合添加?我想总结特征。

标签: c++ scala c++11 mixins


【解决方案1】:

除了 emesx 建议的静态方法之外,我还熟悉至少一个 C++ 库,它允许您在运行时使用 mixins 构建对象。在定义和调用方法时,您牺牲了一些东西,例如自然的 C++ 语法,但您获得了其他好处,例如大大减少了代码中的物理依赖性和运行时的更大灵活性。它的起源植根于entity-component systems,在游戏开发行业非常流行,实现起来相当高效。

https://github.com/iboB/dynamix

【讨论】:

    【解决方案2】:

    如果这些是您现有的课程:

    class Person
    {
    public:
        Person(const string& name): name_(name) {}
        void name() { cout << "name: " << name_ << endl; }
    
    protected:
        string name_;
    };
    
    class Singer
    {
    public:
        Singer(const string& song, int year): song_(song), year_(year) {}
        void song() { cout << "song: " << song_ << ", " << year_ << endl; }
    
    protected:
        string song_;
        int year_;
    };
    

    然后你可以在 C++11 中玩转这个概念

    template<typename... Mixins>
    class Mixer: public Mixins...
    {
    public:
        Mixer(const Mixins&... mixins): Mixins(mixins)... {}
    };
    

    像这样使用它:

    int main() {    
        Mixer<Person,Singer> dylan{{"Dylan"} , {"Like a Rolling Stone", 1965}};
    
        dylan.name();
        dylan.song(); 
    }
    

    【讨论】:

    • auto dylan = Mixer&lt;Person, Singer&gt; {{"Dylan"} , {"Like a Rolling Stone", 1965}}; 具有与 Scala 中相同的从左到右声明。
    • 根据我对 Scala 的 mixin 的理解,它们是 stackable,因为声明中最右边的那个覆盖了它左边实体的方法。如果是这种情况,那么多重继承将不会以相同的方式起作用,但是单一的模板化继承会。在给出的示例中,Person 将是一个从其自己的模板参数派生的模板类,类似于auto dylan = Singer&lt;Person&gt;;
    • 使用concepts 也应该可以实现等效于Scala 的trait Doubling extends IntQueue,其中IntQueue 将是一个概念。
    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多