wandbox example - (works with C ++ 11)
If you do not require SFINAE, you can use static_assert to make sure your conditions are met:
template <typename... Types> class Test { public: template <typename... Ts> void Func(Ts...) { static_assert(sizeof...(Ts) == sizeof...(Types), ""); static_assert(std::conjunction<std::is_same<Ts, int>...>{}, ""); } };
(If you need SFINAE, use std::enable_if .)
std::conjunction checks that all conditions passed to it are true.
In the above example, the following calls are valid / invalid:
myTest.Func(905, 36, 123315); // valid myTest.Func(905, 36, 123315.f); // invalid myTest.Func(905, 22); // invalid
As you can see, implicit conversions are not allowed by this solution. You can use std::is_convertible instead of std::is_same if you want them to be allowed.
Vittorio romeo
source share