#include template struct Pack { static constexpr std::size_t size = sizeof...(Ts); }; template struct Unique; template struct Unique { static constexpr int value = 1; }; template struct Unique { static constexpr int value = 0; }; template struct Unique { static constexpr int value = Unique::value; }; template struct Count_Unique; template <> struct Count_Unique<> { public: static constexpr int value = 0; }; template struct Count_Unique { public: static constexpr int value = 1; }; template struct Count_Unique { public: static constexpr int value = Unique::value + Count_Unique::value; }; int main() { static_assert( Count_Unique<>::value == 0 ); static_assert( Count_Unique::value == 1 ); static_assert( Count_Unique::value == 3 ); static_assert( Count_Unique::value == 2 ); static_assert( Count_Unique::value == 2 ); }