#include <iostream>
#include <utility>
struct Foo
{
template <typename T>
void setArg(int i, const T& t)
{
std::cout << "setArg(" << i << ", " << t << ")\n";
}
};
namespace detail
{
template <std::size_t ... Is, typename ... Ts>
void SetFoo(Foo& foo, std::index_sequence<Is...>, Ts&&... args)
{
int dummy[] = {0, (foo.setArg(Is, args), void(), 0)...};
(void) dummy; // Remove warning for unused variable
}
}
template <typename ... Ts>
void SetFoo(Foo& foo, Ts&&... args)
{
detail::SetFoo(foo, std::index_sequence_for<Ts...>(), std::forward<Ts>(args)...);
}
int main() {
Foo foo;
SetFoo(foo, '*', 42, "hello world", 4.2f);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnN0cnVjdCBGb28KewoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cgl2b2lkIHNldEFyZyhpbnQgaSwgY29uc3QgVCYgdCkKCXsKCQlzdGQ6OmNvdXQgPDwgInNldEFyZygiIDw8IGkgPDwgIiwgIiA8PCB0IDw8ICIpXG4iOwoJfQp9OwoKbmFtZXNwYWNlIGRldGFpbAp7CiAgICB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgLi4uIElzLCB0eXBlbmFtZSAuLi4gVHM+CiAgICB2b2lkIFNldEZvbyhGb28mIGZvbywgc3RkOjppbmRleF9zZXF1ZW5jZTxJcy4uLj4sIFRzJiYuLi4gYXJncykKICAgIHsKICAgICAgICBpbnQgZHVtbXlbXSA9IHswLCAoZm9vLnNldEFyZyhJcywgYXJncyksIHZvaWQoKSwgMCkuLi59OwogICAgICAgICh2b2lkKSBkdW1teTsgLy8gUmVtb3ZlIHdhcm5pbmcgZm9yIHVudXNlZCB2YXJpYWJsZQogICAgfQp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uIFRzPgp2b2lkIFNldEZvbyhGb28mIGZvbywgVHMmJi4uLiBhcmdzKQp7CiAgICBkZXRhaWw6OlNldEZvbyhmb28sIHN0ZDo6aW5kZXhfc2VxdWVuY2VfZm9yPFRzLi4uPigpLCBzdGQ6OmZvcndhcmQ8VHM+KGFyZ3MpLi4uKTsKfQoKCmludCBtYWluKCkgewoJRm9vIGZvbzsKCQoJU2V0Rm9vKGZvbywgJyonLCA0MiwgImhlbGxvIHdvcmxkIiwgNC4yZik7Cn0K