Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
template<class... Bases> struct derived : boost::mpl::inherit<Bases...>::type
{
typedef boost::mpl::vector<Bases...> types;
};
class A {.....};
class B {.....};
class C {.....};
class Derived : public derived<A,B,C> {.....};
// тэг для вызова конструктора без параметров
enum skipctor_type { skipctor };
// boost::mpl::inherit своими руками
template<class... Bases> struct derived_;
template<> struct derived_<> {};
template<class Base, class... Bases> struct derived_<Base,Bases...>
: Base, derived_<Bases...>
{
// дефолт-конструктор предполагает дефолт-конструктор у всех баз, начиная с этой
derived_()
{}
// скип-конструктор - эту базу по дефолту, остальные по списку
template<class... Args>
derived_(skipctor_type arg, Args&&... args)
: derived_<Bases...>(args...)
{}
// все базы по списку
template<class Arg, class... Args>
derived_(Arg&& arg, Args&&... args)
: Base(arg)
, derived_<Bases...>(args...)
{}
};
template<class... Bases> struct derived : derived_<Bases...>
{
typedef derived allbases;
typedef boost::mpl::vector<Bases...> baseclasses;
derived() {}
template<class... Args>
derived(Args&&... args)
: derived_<Bases...>(args...)
{}
};
struct A { A(int,int,int) {} };
struct B { };
struct C { C(int) {} };
struct D : derived<A,B,C>
{
D() : allbases(A(1,2,3),skipctor,4) {}
};
struct D : derived<A,B,C>
{
// D() : allbases(A(1,2,3), skipctor, 4 ) {}
D() : allbases(ctor_args(1,2,3), ctor_args(), ctor_args(4)) {}
};
Обработка структуры по списку базовых типов