#include <iostream>
#include <tuple>

class A
{
public:
    void doIt() { std::cout << "A" << std::endl; }
};

class B
{
public:
    void doIt() { std::cout << "B" << std::endl; }
};

class Visitor {
public:
    template <class C>
    void operator()(C &c)
    {
        c.doIt();
    }
};

template <class F, class C>
void
visitAll(F visitor, C &&c)
{
    visitor(c);
}

template <class F, class C, class... Args>
void
visitAll(F visitor, C &&c, Args... A)
{
    visitor(c);
    visitAll(visitor, A...);
}

int
main(int argc, char *argv[])
{
    visitAll(Visitor(), A(), B());
    return 0;
}
