#include <tuple>
#include <utility>
template<std::size_t I = 0, typename FuncT, typename... Tp>
inline typename std::enable_if<I == sizeof...(Tp), void>::type
for_each(std::tuple<Tp...> &, FuncT) // Unused arguments are given no names.
{ }
template<std::size_t I = 0, typename FuncT, typename... Tp>
inline typename std::enable_if<I < sizeof...(Tp), void>::type
for_each(std::tuple<Tp...>& t, FuncT f)
{
f(std::get<I>(t));
for_each<I + 1, FuncT, Tp...>(t, f);
}
struct Window{
void show(){}
//stuff
}w1, w2, w3;
struct Widget{
void show(){}
//stuff
}w4, w5, w6;
struct Toolbar{
void show(){}
//stuff
}t1, t2, t3;
int main() {
auto t = std::make_tuple(w3, w4, w5, t1);
for_each(t, [](auto &obj){
obj.show();
});
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dXRpbGl0eT4gCgp0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBJID0gMCwgdHlwZW5hbWUgRnVuY1QsIHR5cGVuYW1lLi4uIFRwPgppbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SSA9PSBzaXplb2YuLi4oVHApLCB2b2lkPjo6dHlwZQogIGZvcl9lYWNoKHN0ZDo6dHVwbGU8VHAuLi4+ICYsIEZ1bmNUKSAvLyBVbnVzZWQgYXJndW1lbnRzIGFyZSBnaXZlbiBubyBuYW1lcy4KICB7IH0KCnRlbXBsYXRlPHN0ZDo6c2l6ZV90IEkgPSAwLCB0eXBlbmFtZSBGdW5jVCwgdHlwZW5hbWUuLi4gVHA+CmlubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJIDwgc2l6ZW9mLi4uKFRwKSwgdm9pZD46OnR5cGUKICBmb3JfZWFjaChzdGQ6OnR1cGxlPFRwLi4uPiYgdCwgRnVuY1QgZikKICB7CiAgICBmKHN0ZDo6Z2V0PEk+KHQpKTsKICAgIGZvcl9lYWNoPEkgKyAxLCBGdW5jVCwgVHAuLi4+KHQsIGYpOwogIH0KICAKc3RydWN0IFdpbmRvd3sKICAgIHZvaWQgc2hvdygpe30KICAgIC8vc3R1ZmYKfXcxLCB3MiwgdzM7CgpzdHJ1Y3QgV2lkZ2V0ewogICAgdm9pZCBzaG93KCl7fQogICAgLy9zdHVmZgp9dzQsIHc1LCB3NjsKCnN0cnVjdCBUb29sYmFyewogICAgdm9pZCBzaG93KCl7fQogICAgLy9zdHVmZgp9dDEsIHQyLCB0MzsKCmludCBtYWluKCkgewoJYXV0byB0ID0gc3RkOjptYWtlX3R1cGxlKHczLCB3NCwgdzUsIHQxKTsKCWZvcl9lYWNoKHQsIFtdKGF1dG8gJm9iail7CgkJb2JqLnNob3coKTsKCX0pOwp9Cg==