Да, это возможно. Просто создайте пару времени компиляции тип:
template <auto First, auto Second>
struct pair
{
static constexpr auto first = First;
static constexpr auto second = Second;
};
Наше создание кортежей внезапно становится чище:
template<typename... Pairs>
constexpr auto foo() noexcept
{
static_assert(((Pairs::second - Pairs::first >= 0) && ...));
return std::tuple((Pairs::second - Pairs::first)...);
}
Здесь - это полное пример.