Можно ли создавать миксины для каждого экземпляра в С++ 11?

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

В Scala я сделал бы это с анонимными классами

val dylan = new Person with Singer

Ответы

Ответ 1

Если это были ваши существующие классы:

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_;
};

Затем вы можете поиграть с этой концепцией в С++ 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(); 
}

Ответ 2

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

https://github.com/iboB/dynamix