#include <iostream>
#include <tuple>
namespace static_iterator
{
template <int... Idx>
struct index { };
template <int N, int... Idx>
struct sequence : sequence<N - 1, N - 1, Idx...> { };
template <int... Idx>
struct sequence<0, Idx...> : index<Idx...> { };
}
struct A {void prnt(){std::cout<<"A\n";} };
struct B {void prnt(){std::cout<<"B\n";} };
struct C {void prnt(){std::cout<<"C\n";} };
template<typename...Arg>
class HeterogenousContainer
{
public:
HeterogenousContainer() :
number_elems(sizeof...(Arg)){}
std::tuple<Arg...> elements;
template <int... Idx>
void process(static_iterator::index<Idx...>)
{
auto aux = { (std::get<Idx>(elements).prnt(), 0) ... };
}
void process()
{
process(static_iterator::sequence<sizeof...(Arg)>());
}
unsigned int get_number_elements(){return number_elems;}
private:
unsigned int number_elems;
};
int main()
{
HeterogenousContainer<A,B,C,A,A,B,C,B,B,C> obj;
obj.process();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CgpuYW1lc3BhY2Ugc3RhdGljX2l0ZXJhdG9yCnsKICAgIHRlbXBsYXRlIDxpbnQuLi4gSWR4PgogICAgc3RydWN0IGluZGV4IHsgfTsKIAogICAgdGVtcGxhdGUgPGludCBOLCBpbnQuLi4gSWR4PgogICAgc3RydWN0IHNlcXVlbmNlIDogc2VxdWVuY2U8TiAtIDEsIE4gLSAxLCBJZHguLi4+IHsgfTsKIAogICAgdGVtcGxhdGUgPGludC4uLiBJZHg+CiAgICBzdHJ1Y3Qgc2VxdWVuY2U8MCwgSWR4Li4uPiA6IGluZGV4PElkeC4uLj4geyB9Owp9CiAKIAogCnN0cnVjdCBBIHt2b2lkIHBybnQoKXtzdGQ6OmNvdXQ8PCJBXG4iO30gfTsgICAgCnN0cnVjdCBCIHt2b2lkIHBybnQoKXtzdGQ6OmNvdXQ8PCJCXG4iO30gfTsgICAgCnN0cnVjdCBDIHt2b2lkIHBybnQoKXtzdGQ6OmNvdXQ8PCJDXG4iO30gfTsKIAp0ZW1wbGF0ZTx0eXBlbmFtZS4uLkFyZz4KY2xhc3MgSGV0ZXJvZ2Vub3VzQ29udGFpbmVyCnsKcHVibGljOgogICAgSGV0ZXJvZ2Vub3VzQ29udGFpbmVyKCkgOiAKICAgICAgICAgICAgbnVtYmVyX2VsZW1zKHNpemVvZi4uLihBcmcpKXt9CiAKICAgIHN0ZDo6dHVwbGU8QXJnLi4uPiBlbGVtZW50czsKIAogICAgdGVtcGxhdGUgPGludC4uLiBJZHg+CiAgICB2b2lkIHByb2Nlc3Moc3RhdGljX2l0ZXJhdG9yOjppbmRleDxJZHguLi4+KQogICAgewogICAgICAgICBhdXRvIGF1eCA9IHsgKHN0ZDo6Z2V0PElkeD4oZWxlbWVudHMpLnBybnQoKSwgMCkgLi4uIH07CiAgICB9CiAKICAgIHZvaWQgcHJvY2VzcygpCiAgICB7CiAgICAgICAgcHJvY2VzcyhzdGF0aWNfaXRlcmF0b3I6OnNlcXVlbmNlPHNpemVvZi4uLihBcmcpPigpKTsKICAgIH0KICAgIAogICAgdW5zaWduZWQgaW50IGdldF9udW1iZXJfZWxlbWVudHMoKXtyZXR1cm4gbnVtYmVyX2VsZW1zO30KICAgIApwcml2YXRlOgogICAgdW5zaWduZWQgaW50IG51bWJlcl9lbGVtczsKfTsKaW50IG1haW4oKQp7ICAKICAgIEhldGVyb2dlbm91c0NvbnRhaW5lcjxBLEIsQyxBLEEsQixDLEIsQixDPiBvYmo7CiAgICBvYmoucHJvY2VzcygpOwp9