#include <iostream>
#include <typeinfo>
template<typename T>
void create()
{
std::cout << "create called with " << typeid(T).name() << std::endl;
}
template<typename...>
struct caller;
template<typename T, typename...Rest>
struct caller<T, Rest...>
{
static void call()
{
create<T>();
caller<Rest...>::call();
}
};
template<>
struct caller<>
{
static void call()
{
}
};
template<typename...classes>
void createObject(){
caller<classes...>::call();
}
int main()
{
createObject<int,float, short>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGNyZWF0ZSgpCnsKICAgc3RkOjpjb3V0IDw8ICJjcmVhdGUgY2FsbGVkIHdpdGggIiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8IHN0ZDo6ZW5kbDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUuLi4+CnN0cnVjdCBjYWxsZXI7CgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi5SZXN0PgpzdHJ1Y3QgY2FsbGVyPFQsIFJlc3QuLi4+CnsKICAgICBzdGF0aWMgdm9pZCBjYWxsKCkKICAgICB7CiAgICAgICAgY3JlYXRlPFQ+KCk7CiAgICAgICAgY2FsbGVyPFJlc3QuLi4+OjpjYWxsKCk7CiAgICAgfQp9Owp0ZW1wbGF0ZTw+CnN0cnVjdCBjYWxsZXI8Pgp7CiAgICAgc3RhdGljIHZvaWQgY2FsbCgpCiAgICAgewogICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lLi4uY2xhc3Nlcz4Kdm9pZCBjcmVhdGVPYmplY3QoKXsKICAgICAgY2FsbGVyPGNsYXNzZXMuLi4+OjpjYWxsKCk7Cn0KCmludCBtYWluKCkKewogICAgICBjcmVhdGVPYmplY3Q8aW50LGZsb2F0LCBzaG9ydD4oKTsKfQ==