Here is my more general solution. compareConsecutive<N> will return true only if N consecutive arguments are equal for all blocks of N arguments.
#include <iostream> #include <tuple> #include <utility> template <std::size_t Start, typename IndexSequence> struct MakeIndexSequenceHelper; template <std::size_t Start, std::size_t... Is> struct MakeIndexSequenceHelper<Start, std::index_sequence<Is...>> { using type = std::index_sequence<(Start + Is)...>; }; template <std::size_t Start, std::size_t Length> struct MakeIndexSequence : MakeIndexSequenceHelper<Start, std::make_index_sequence<Length>> {}; template <typename T, typename U> bool allAreSame (const T&, const U&) { return false; } template <typename T> bool allAreSame (const T& t1, const T& t2) { return t1 == t2; } template <typename T, typename U, typename... Args> bool allAreSame (const T&, const U&, const Args&...) { return false; } template <typename T, typename... Args> bool allAreSame (const T& t1, const T& t2, const Args&... args) { return allAreSame(t1, t2) && allAreSame(t1, args...); } template <typename Tuple, std::size_t... Is> bool allAreSameHelper (Tuple&& tuple, std::index_sequence<Is...>) { return allAreSame (std::get<Is>(std::forward<Tuple>(tuple))...); } template <std::size_t N, typename... Args> bool allAreSameHelper (Args&&... args) { return allAreSameHelper (std::forward_as_tuple(std::forward<Args>(args)...), std::make_index_sequence<N>{}); } template <std::size_t N, typename... Args> bool compareConsecutive (Args&&...); template <std::size_t N> bool compareConsecutive() {return true;} template <std::size_t N, typename Tuple, std::size_t... Is> bool compareConsecutiveHelper (Tuple&& tuple, std::index_sequence<Is...>) { return compareConsecutive<N> (std::get<Is>(std::forward<Tuple>(tuple))...); } template <std::size_t N, std::size_t Start, std::size_t Length, typename... Args> bool compareConsecutiveHelper (Args&&... args) { return compareConsecutiveHelper<N> (std::forward_as_tuple(std::forward<Args>(args)...), typename MakeIndexSequence<Start, Length>::type{}); } template <std::size_t N, typename... Args> bool compareConsecutive (Args&&... args) { return allAreSameHelper<N>(std::forward<Args>(args)...) && compareConsecutiveHelper<N, N, sizeof...(Args) - N>(args...); } int main() { std::cout << std::boolalpha << allAreSame("hi", "hi", "hi", "hi", "hi", "hi") << '\n'; // true std::cout << compareConsecutive<2>(1, 1, "hi", "hi") << '\n'; // true std::cout << compareConsecutive<2>(1, "hi", "hi", "hi") << '\n'; // false std::cout << compareConsecutive<3>(1, 1, 1, "hi", "hi", "hi", 4.5, 4.5, 4.5) << '\n'; // true std::cout << compareConsecutive<5>(1, 1, 1, 1, 1, "hi", "hi", "hi", "hi", "hi") << '\n'; // true std::cout << compareConsecutive<5>(1, 1, 1, 1, 2, "hi", "hi", "hi", "hi", "hi") << '\n'; // false }