A variadic constructor wants to accept only a uniform list — say, N coordinates of the same type. To reject a mixed call at compile time you first need a way to ASK the question at compile time: are all these types identical? That is a metafunction: types in, constant out.
Implement allSame_v<Ts...> — a compile-time check that every type in the pack is the same. allSame_v<int, int> == true, allSame_v<int, long> == false. The tests run entirely in static_assert.
allSame_v<> and allSame_v<T> are true (zero or one type counts as uniform)allSame_v<int, const int> is falseIt is enough to compare every type with the FIRST one — they are all equal exactly when each equals the first.
A fold over && does the rest: (std::is_same_v<First, Rest> && ...). Mind the empty pack — an empty && fold is true.
Hit Submit (or ⌘/Ctrl + ↵) — test results will show up here.