2013-07-13 3 views
15

Возможно ли создать mixins в C++ (C++ 11) - я хочу создать поведение для каждого экземпляра, а не для каждого класса.Можно ли создавать миксины для каждого экземпляра в C++ 11?

В Scala я хотел бы сделать это с помощью анонимных классов

val dylan = new Person with Singer 
+0

Является ли класс шаблонов удовлетворительным вашим спросом? – lulyon

+0

Hm. Не похоже на микшину, как «создать новый тип, улучшив другой тип». То есть, его поведение не является экземпляром. – Aleph

+0

@lulyon да, основываясь на количестве кода. Я бы хотел простое использование –

ответ

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

или 'auto dylan = Mixer {{« Dylan »}, {« Like a Rolling Stone », 1965}};' чтобы иметь такое же право налево, как и в Scala. – TemplateRex

+0

Из-за того, что я недооценил микшинов Scala, они [стекируются] (http://www.artima.com/scalazine/articles/stackable_trait_pattern.html) в том смысле, что самый правый в декларации отменяет методы от объекта в его левой. Если это так, то множественное наследование не будет действовать одинаково, однако одно, шаблонное наследование будет. В приведенном примере 'Person' будет классом шаблона, который будет выводиться из его собственного параметра шаблона, например' auto dylan = Singer ; '. –

+0

С [концепциями] (https://isocpp.org/blog/2016/02/a-bit-of-background-for-concepts-and-cpp17-bjarne-stroustrup) также должно быть возможно реализовать эквивалент Scala ['trait Doubling extends IntQueue'] (http://www.artima.com/scalazine/articles/stackable_trait_pattern.html), где' IntQueue' будет концепцией. –

5

Помимо статического подхода, предлагаемого emesx, я знаком с хотя бы одной библиотекой C++, которая позволяет создавать объекты из миксинов во время выполнения. Вы жертвуете некоторыми вещами, как естественный синтаксис C++ при определении и вызове методов, но вы получаете другие преимущества, такие как значительно уменьшенные физические зависимости в коде и большая гибкость во время выполнения. Его происхождение коренится в entity-component systems, которые довольно популярны в индустрии разработки игр, и реализация довольно впечатляющая.

https://github.com/iboB/dynamix