#include <iostream>
#include <typeinfo>
template<typename T>
void create()
{
std::cout << "create called with " << typeid(T).name() << std::endl;
}
template<typename...>
struct typelist{};
template<typename T, typename ... Rest>
void call(typelist<T,Rest...>)
{
create<T>();
call(typelist<Rest...>());
};
void call(typelist<>) { }
template<typename...classes>
void createObject(){
call(typelist<classes...>());
}
int main()
{
createObject<int,float, short>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGNyZWF0ZSgpCnsKICAgc3RkOjpjb3V0IDw8ICJjcmVhdGUgY2FsbGVkIHdpdGggIiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8IHN0ZDo6ZW5kbDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUuLi4+CnN0cnVjdCB0eXBlbGlzdHt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uIFJlc3Q+CnZvaWQgY2FsbCh0eXBlbGlzdDxULFJlc3QuLi4+KQp7CiAgY3JlYXRlPFQ+KCk7CiAgY2FsbCh0eXBlbGlzdDxSZXN0Li4uPigpKTsKfTsKCnZvaWQgY2FsbCh0eXBlbGlzdDw+KSB7IH0KCnRlbXBsYXRlPHR5cGVuYW1lLi4uY2xhc3Nlcz4Kdm9pZCBjcmVhdGVPYmplY3QoKXsKICAgICAgY2FsbCh0eXBlbGlzdDxjbGFzc2VzLi4uPigpKTsKfQoKaW50IG1haW4oKQp7CiAgICAgIGNyZWF0ZU9iamVjdDxpbnQsZmxvYXQsIHNob3J0PigpOwp9