Как использовать пару в качестве шаблона с переменным количеством аргументов?

Хоче передать в функцию переменное число пар enum/значение, как это сделать? Пробовал так

template<typename EnumT, typename CharT, std::pair<EnumT, CharT> KeyValueT>
constexpr auto makeStringsMap(KeyValueT... kv)
{

}

и так

template<typename... KeyValueT>
constexpr auto makeStringsMap(KeyValueT... kv)
{
    static_assert(std::is_enum_v<decltype(std::get<0>(kv))>);
}

в обоих случаях компилятор ргуается


Ответы (1 шт):

Автор решения: Chorkov

Подход с ассертом - приводит к ошибке компиляции, внутри функции, в случае неправильного использования.

template<typename... T1, typename ... T2>
constexpr auto makeStringsMap(std::pair<T1,T2>... kv)
{
    static_assert(  (std::is_enum_v<T1> && ... ) );
}

Другой вариант:

template<typename T>
concept IsEnum=std::is_enum_v<T>;

template< IsEnum... T1, typename ... T2>
constexpr auto makeStringsMap(std::pair<T1,T2>... kv)
{
    return 1;
}

проверка работы:

enum ABC {a,b,c};
auto test = makeStringsMap( std::make_pair(a,1.2), std::make_pair(a,"foo")  );

→ Ссылка