#include <iostream>
#include <cstdarg>
using namespace std;
template<typename T>
void Print(T val) {
cout << val << endl;
}
struct MyStruct {
MyStruct(int a) : b(a) {}
void print() { cout << "MS: " << b << endl; }
int b;
};
void Print(MyStruct &val) {
val.print();
}
template<typename T>
void Foobar(int nNumberofParams,...) {
va_list args;
va_start(args,nNumberofParams);
for(int i =0 ; i < nNumberofParams; i++)
{
T val = va_arg(args,T);
Print(val);
}
va_end(args);
}
int main() {
Foobar<int>(3, 1, 2, 3);
Foobar<MyStruct>(2, MyStruct(1), MyStruct(2));
Foobar<MyStruct>(2, 3, 4);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGFyZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAKdm9pZCBQcmludChUIHZhbCkgewogIGNvdXQgPDwgdmFsIDw8IGVuZGw7Cn0KCnN0cnVjdCBNeVN0cnVjdCB7CiAgTXlTdHJ1Y3QoaW50IGEpIDogYihhKSB7fQogIHZvaWQgcHJpbnQoKSB7IGNvdXQgPDwgIk1TOiAiIDw8IGIgPDwgZW5kbDsgfQogIGludCBiOwp9OwoKdm9pZCBQcmludChNeVN0cnVjdCAmdmFsKSB7CiB2YWwucHJpbnQoKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBGb29iYXIoaW50IG5OdW1iZXJvZlBhcmFtcywuLi4pIHsKICB2YV9saXN0IGFyZ3M7ICAKICB2YV9zdGFydChhcmdzLG5OdW1iZXJvZlBhcmFtcyk7CiAgZm9yKGludCBpID0wIDsgaSA8IG5OdW1iZXJvZlBhcmFtczsgaSsrKQogIHsgIAogICAgVCB2YWwgPSB2YV9hcmcoYXJncyxUKTsKICAgIFByaW50KHZhbCk7CiAgfQogIHZhX2VuZChhcmdzKTsKfQoKaW50IG1haW4oKSB7CiAgRm9vYmFyPGludD4oMywgMSwgMiwgMyk7CiAgRm9vYmFyPE15U3RydWN0PigyLCBNeVN0cnVjdCgxKSwgTXlTdHJ1Y3QoMikpOwogIEZvb2JhcjxNeVN0cnVjdD4oMiwgMywgNCk7Cn0=