#include <iostream>
#include <string>
template<class T>
struct Foo {
Foo(T val) {
std::cout << "Called single argument ctor" << std::endl;
// [...]
}
// How to enforce U to be the same type as T?
template<class... U>
Foo(T first, U... vals) {
std::cout << "Called multiple argument ctor" << std::endl;
// [...]
}
};
int main()
{
// Should work as expected.
Foo<int> single(1);
// Should work as expected.
Foo<int> multiple(1,2,3,4,5);
// Should't work. The strings are not integers.
Foo<int> mixedtype(1, "a", "b", "c");
// Also shouldn't work.
// Foo<int> alsomixedtype(1, 1, "b", "c");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgogCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBGb28gewogCiAgICBGb28oVCB2YWwpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkNhbGxlZCBzaW5nbGUgYXJndW1lbnQgY3RvciIgPDwgc3RkOjplbmRsOwogICAgICAgIC8vIFsuLi5dICAgIAogICAgfSAgICAKIAogICAgLy8gSG93IHRvIGVuZm9yY2UgVSB0byBiZSB0aGUgc2FtZSB0eXBlIGFzIFQ/CiAgICB0ZW1wbGF0ZTxjbGFzcy4uLiBVPgogICAgRm9vKFQgZmlyc3QsIFUuLi4gdmFscykgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQ2FsbGVkIG11bHRpcGxlIGFyZ3VtZW50IGN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAvLyBbLi4uXSAgIAogICAgfQogCn07CiAKaW50IG1haW4oKQp7CiAKICAgIC8vIFNob3VsZCB3b3JrIGFzIGV4cGVjdGVkLgogICAgRm9vPGludD4gc2luZ2xlKDEpOwogICAgCiAgICAvLyBTaG91bGQgd29yayBhcyBleHBlY3RlZC4KICAgIEZvbzxpbnQ+IG11bHRpcGxlKDEsMiwzLDQsNSk7CiAKIAkvLyBTaG91bGQndCB3b3JrLiBUaGUgc3RyaW5ncyBhcmUgbm90IGludGVnZXJzLgogICAgRm9vPGludD4gbWl4ZWR0eXBlKDEsICJhIiwgImIiLCAiYyIpOwogICAgCiAgICAvLyBBbHNvIHNob3VsZG4ndCB3b3JrLgogICAgLy8gRm9vPGludD4gYWxzb21peGVkdHlwZSgxLCAxLCAiYiIsICJjIik7Cn0=