是否可以在C++11中创建每个实例的mixin

Is it possible to create per-instance mixins in C++11?

本文关键字:实例 mixin 创建 C++11 是否      更新时间:2023-10-16

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

在Scala中,我会用匿名类来实现这一点

val dylan = new Person with Singer

如果这些是您现有的类:

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

除了emesx建议的静态方法外,我还熟悉至少一个C++库,它允许您在运行时从mixin构建对象。在定义和调用方法时,您牺牲了一些东西,比如自然的C++语法,但您获得了其他好处,比如大大减少了代码中的物理依赖性,并在运行时具有更大的灵活性。它的起源源于实体组件系统,这在游戏开发行业非常流行,并且实现非常高效。

https://github.com/iboB/dynamix