В C ++ до 11 у меня было что-то вроде этого:
template<class T,class U,class V>
struct Foo : T,U,V {
bool init() {
if(!T::init() || !U::init() || !V::init())
return false;
// do local init and return true/false
}
};
Я хотел бы преобразовать это в вариативный синтаксис C ++ 11, чтобы воспользоваться преимуществами списка аргументов гибкой длины. Я понимаю концепцию распаковки списка аргументов шаблона с использованием рекурсии, но я просто не могу понять, как правильно понять синтаксис. Вот что я пробовал:
template<typename... Features>
struct Foo : Features... {
template<typename F,typename... G>
bool recinit(F& arg,G&& ...args) {
if(!F::init())
return false;
return recinit<F,G...>(args...);
}
bool init() {
// how to call recinit() from here?
}
};
Я бы предпочел, чтобы порядок вызовов функций init () базового класса был слева направо, но это не критично.
recinit
функция бесконечно рекурсивна, или я ошибаюсь? как вы рассчитываете вызвать его изinit()
, с какими аргументами? - person Andy Prowl   schedule 08.03.2013init
и используйте конструктор. - person Nicol Bolas   schedule 08.03.2013