#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");
}