#include <utility>
#include <algorithm>
template<typename... Features>
struct Foo : Features...
{
bool init()
{
typedef bool (Foo::*fptr)();
auto il = {static_cast<fptr>(&Features::init)...};
return std::all_of(il.begin(), il.end(), [&](fptr f){ return (this->*f)(); });
}
};
#include <iostream>
using namespace std;
struct A { bool init() { cout << "Hello " << endl; return true; } };
struct B { bool init() { cout << "Template " << endl; return true; } };
struct C { bool init() { cout << "World!" << endl; return true; } };
int main()
{
Foo<A, B, C> f;
bool res = f.init(); // Prints "Hello Template World!"
cout << res; // Prints 1
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBGZWF0dXJlcz4Kc3RydWN0IEZvbyA6IEZlYXR1cmVzLi4uCnsKICAgIGJvb2wgaW5pdCgpCiAgICB7CiAgICAgICAgdHlwZWRlZiBib29sIChGb286OipmcHRyKSgpOwogICAgICAgIGF1dG8gaWwgPSB7c3RhdGljX2Nhc3Q8ZnB0cj4oJkZlYXR1cmVzOjppbml0KS4uLn07IAogICAgICAgIHJldHVybiBzdGQ6OmFsbF9vZihpbC5iZWdpbigpLCBpbC5lbmQoKSwgWyZdKGZwdHIgZil7IHJldHVybiAodGhpcy0+KmYpKCk7IH0pOwogICAgfQp9OwoKI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBIHsgYm9vbCBpbml0KCkgeyBjb3V0IDw8ICJIZWxsbyAiIDw8IGVuZGw7IHJldHVybiB0cnVlOyB9IH07CnN0cnVjdCBCIHsgYm9vbCBpbml0KCkgeyBjb3V0IDw8ICJUZW1wbGF0ZSAiIDw8IGVuZGw7IHJldHVybiB0cnVlOyB9IH07CnN0cnVjdCBDIHsgYm9vbCBpbml0KCkgeyBjb3V0IDw8ICJXb3JsZCEiIDw8IGVuZGw7IHJldHVybiB0cnVlOyB9IH07CgppbnQgbWFpbigpCnsKICAgIEZvbzxBLCBCLCBDPiBmOwogICAgYm9vbCByZXMgPSBmLmluaXQoKTsgLy8gUHJpbnRzICJIZWxsbyBUZW1wbGF0ZSBXb3JsZCEiCiAgICBjb3V0IDw8IHJlczsgLy8gUHJpbnRzIDEKfQ==