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

Roa*_*pol 15 c++ scala mixins c++11

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

在Scala中,我会使用匿名类来完成此操作

val dylan = new Person with Singer
Run Code Online (Sandbox Code Playgroud)

eme*_*esx 33

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

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_;
};
Run Code Online (Sandbox Code Playgroud)

然后你可以在C++ 11中使用这个概念

template<typename... Mixins>
class Mixer: public Mixins...
{
public:
    Mixer(const Mixins&... mixins): Mixins(mixins)... {}
};
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

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

    dylan.name();
    dylan.song(); 
}
Run Code Online (Sandbox Code Playgroud)

  • 或者`auto dylan = Mixer <Person,Singer> {{"Dylan"},{"像滚石",1965年}};`具有与Scala相同的从左到右的声明. (6认同)

zah*_*zah 5

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

https://github.com/iboB/dynamix