是否可以在C ++中创建mixins(C ++ 11) - 我想为每个实例创建行为,而不是每个类。
在Scala中,我会使用匿名类
执行此操作val dylan = new Person with Singer
答案 0 :(得分: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_;
};
然后你可以在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();
}
答案 1 :(得分:5)
除了emesx建议的静态方法之外,我熟悉至少一个允许您在运行时使用mixins构建对象的C ++库。在定义和调用方法时,您牺牲了一些像自然C ++语法的东西,但是您获得了其他好处,例如代码中的物理依赖性大大降低,运行时更灵活。它的起源根植于entity-component systems,它在游戏开发行业非常受欢迎,并且实现效果非常好。