#include <iostream>
template <typename T, typename ...Ts>
struct Foo {
template <typename ...Us>
static void bar(T& oT0, T& oT1, const T& iT0, const T& iT1, Us... args) {
std::cout << " -> Foo<...>::bar() enter [ " << oT0 << ", " << oT1 << " ]" << std::endl;
Foo<T>::bar(oT0, oT1, iT0, iT1);
Foo<Ts...>::bar(args...);
std::cout << " <- Foo<...>::bar() exit [ " << oT0 << ", " << oT1 << " ]" << std::endl;
}
};
template <typename T>
struct Foo<T> {
static void bar(T& oT0, T& oT1, const T& iT0, const T& iT1) {
std::cout << " -> Foo<>::bar() enter [ " << oT0 << ", " << oT1 << " ]" << std::endl;
oT0 = iT0;
oT1 = iT1;
std::cout << " <- Foo<>::bar() exit [ " << oT0 << ", " << oT1 << " ]" << std::endl;
}
};
int main() {
int i0 = -1,
i1 = 0;
float f0 = -97.18f,
f1 = 3.141592f;
std::cout << "( "<< i0 << ", " << i1 << "; " << f0 << ", " << f1 << " ) " << std::endl;
Foo<int, float, int>::bar(i0, i1, 0, 1, f0, f1, 18.f, -7.f, i0, i1, 4, 17);
std::cout << "( "<< i0 << ", " << i1 << "; " << f0 << ", " << f1 << " ) " << std::endl;
Foo<float>::bar(f0, f1, 18.f, -7.f);
std::cout << "( " << f0 << ", " << f1 << " ) " << std::endl;
Foo<float, int>::bar(f0, f1, 2.71f, 9000.1f, i0, i1, 4, 17);
std::cout << "( "<< i0 << ", " << i1 << "; " << f0 << ", " << f1 << " ) " << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5Ucz4Kc3RydWN0IEZvbyB7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uVXM+CiAgICBzdGF0aWMgdm9pZCBiYXIoVCYgb1QwLCBUJiBvVDEsIGNvbnN0IFQmIGlUMCwgY29uc3QgVCYgaVQxLCBVcy4uLiBhcmdzKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIgLT4gRm9vPC4uLj46OmJhcigpIGVudGVyIFsgIiA8PCBvVDAgPDwgIiwgIiA8PCBvVDEgPDwgIiBdIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgRm9vPFQ+OjpiYXIob1QwLCBvVDEsIGlUMCwgaVQxKTsKICAgICAgICBGb288VHMuLi4+OjpiYXIoYXJncy4uLik7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIgPC0gRm9vPC4uLj46OmJhcigpIGV4aXQgWyAiIDw8IG9UMCA8PCAiLCAiIDw8IG9UMSA8PCAiIF0iIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgRm9vPFQ+IHsKICAgIHN0YXRpYyB2b2lkIGJhcihUJiBvVDAsIFQmIG9UMSwgY29uc3QgVCYgaVQwLCBjb25zdCBUJiBpVDEpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIiAtPiBGb288Pjo6YmFyKCkgZW50ZXIgWyAiIDw8IG9UMCA8PCAiLCAiIDw8IG9UMSA8PCAiIF0iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBvVDAgPSBpVDA7CiAgICAgICAgb1QxID0gaVQxOwogICAgICAgIHN0ZDo6Y291dCA8PCAiIDwtIEZvbzw+OjpiYXIoKSBleGl0IFsgIiA8PCBvVDAgPDwgIiwgIiA8PCBvVDEgPDwgIiBdIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgoKaW50IG1haW4oKSB7CiAgICBpbnQgaTAgPSAtMSwKICAgICAgICBpMSA9IDA7CiAgICBmbG9hdCBmMCA9IC05Ny4xOGYsCiAgICAgICAgICBmMSA9IDMuMTQxNTkyZjsKICAgIHN0ZDo6Y291dCA8PCAiKCAiPDwgaTAgPDwgIiwgIiA8PCBpMSA8PCAiOyAiIDw8IGYwIDw8ICIsICIgPDwgZjEgPDwgIiApICIgPDwgc3RkOjplbmRsOwoKICAgIEZvbzxpbnQsIGZsb2F0LCBpbnQ+OjpiYXIoaTAsIGkxLCAwLCAxLCBmMCwgZjEsIDE4LmYsIC03LmYsIGkwLCBpMSwgNCwgMTcpOwogICAgc3RkOjpjb3V0IDw8ICIoICI8PCBpMCA8PCAiLCAiIDw8IGkxIDw8ICI7ICIgPDwgZjAgPDwgIiwgIiA8PCBmMSA8PCAiICkgIiA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIEZvbzxmbG9hdD46OmJhcihmMCwgZjEsIDE4LmYsIC03LmYpOwogICAgc3RkOjpjb3V0IDw8ICIoICIgPDwgZjAgPDwgIiwgIiA8PCBmMSA8PCAiICkgIiA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIEZvbzxmbG9hdCwgaW50Pjo6YmFyKGYwLCBmMSwgMi43MWYsIDkwMDAuMWYsIGkwLCBpMSwgNCwgMTcpOwogICAgc3RkOjpjb3V0IDw8ICIoICI8PCBpMCA8PCAiLCAiIDw8IGkxIDw8ICI7ICIgPDwgZjAgPDwgIiwgIiA8PCBmMSA8PCAiICkgIiA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIHJldHVybiAwOwp9Cg==
( -1, 0; -97.18, 3.14159 )
-> Foo<...>::bar() enter [ -1, 0 ]
-> Foo<>::bar() enter [ -1, 0 ]
<- Foo<>::bar() exit [ 0, 1 ]
-> Foo<...>::bar() enter [ -97.18, 3.14159 ]
-> Foo<>::bar() enter [ -97.18, 3.14159 ]
<- Foo<>::bar() exit [ 18, -7 ]
-> Foo<>::bar() enter [ -1, 0 ]
<- Foo<>::bar() exit [ 4, 17 ]
<- Foo<...>::bar() exit [ 18, -7 ]
<- Foo<...>::bar() exit [ 0, 1 ]
( 0, 1; -97.18, 3.14159 )
-> Foo<>::bar() enter [ -97.18, 3.14159 ]
<- Foo<>::bar() exit [ 18, -7 ]
( 18, -7 )
-> Foo<...>::bar() enter [ 18, -7 ]
-> Foo<>::bar() enter [ 18, -7 ]
<- Foo<>::bar() exit [ 2.71, 9000.1 ]
-> Foo<>::bar() enter [ 0, 1 ]
<- Foo<>::bar() exit [ 4, 17 ]
<- Foo<...>::bar() exit [ 2.71, 9000.1 ]
( 0, 1; 2.71, 9000.1 )