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

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

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

val dylan = new Person with Singer

15

Решение

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

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

Другие решения

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

https://github.com/iboB/dynamix

5

По вопросам рекламы [email protected]