Решение смесительной проблемы конструктора в C++ с помощью variadic шаблоны

Я недавно занялся проблемой конструктора, где различный mixins классы, которые украшают друг друга (и самый верхний класс хоста) имеют различные подписи конструктора. Для поддержания единственного конструктора в получающемся украшенном классе, и не добавляя init функции я нашел следующее решение. Единственное ограничение, которое это устанавливает для смесительного класса, - то, что, если его конструктор берет больше чем один параметр, они должны все инкапсулироваться в единственном кортеже. (Компилирующий этот код с g ++ требует-std=c ++ 0x флаги),

#include 

// Base class for all mixins
struct Host {
    float f_;
    int i_;

    Host(float f, int i) : f_(f), i_(i) {}
};

// First mixin--constructs with 1 parameter
template 
struct M1 : public B {
    char c_;

    template 
    M1(char c, const A&... a) : B(a...), c_(c) {}
};

// Second mixin--constructs with 3 parameters
template 
struct M2 : public B {
    double d_;
    short s_;
    const char* p_;

    template 
    M2(boost::tuple t, const A&... a)
    : B(a...), p_(t.get<0>()), d_(t.get<1>()), s_(t.get<2>()) {}
};


int main() {
    // ctor parameters go in this order, from most derived to base:
    M2> tst(boost::make_tuple("test", 46.1, (short)-1), (char)5, 4.2f, 2);
  return 0;
}

Мои вопросы:
1) Существует ли лучший, более изящный способ решить эту проблему с C++ 0X?
2) А именно, кортежи действительно необходимы?

5
задан Eitan 31 July 2010 в 15:48
поделиться