Я работаю над проектом С++ 14 и только что написал функцию с пакетом параметров.
template <typename... Args>
void func(Args&&... args) {
...
}
args должен содержать только int или std::string, других типов быть не может.
Есть ли способ сделать проверку во время компиляции? Может быть, что-то, как показано ниже?
template <typename... Args, std::enable_if_t<???* = nullptr>
void func(Args&&... args) {
...
}
Ваши теги и текст вашего вопроса не совпадают с версией C++. Пожалуйста, примите решение.





Это улучшается со сгибами в C++17 и понятиями в C++20, но вы можете проверить каждый элемент на соответствие int и std::string.
Первый конец рекурсии является первичным шаблоном. Если ни одна специализация не соответствует, мы ложны.
template <typename... Ts>
struct all_int_or_string : std::false_type {};
Другой конец рекурсии — это пустая упаковка, что верно.
template <>
all_int_or_string<> : std::true_type {};
Если мы найдем int или std::string в качестве первого элемента, рекурсивно рекурсивно оставшиеся элементы
template <typename... Ts>
struct all_int_or_string<int, Ts...> : all_int_or_string<Ts...> {}
template <typename... Ts>
struct all_int_or_string<std::string, Ts...> : all_int_or_string<Ts...> {}
Возможно, вы также захотите убрать квалификаторы.
template <typename T, typename... Ts>
struct all_int_or_string<const T, Ts...> : all_int_or_string<T, Ts...> {}
template <typename T, typename... Ts>
struct all_int_or_string<volatile T, Ts...> : all_int_or_string<T, Ts...> {}
template <typename T, typename... Ts>
struct all_int_or_string<T &, Ts...> : all_int_or_string<T, Ts...> {}
template <typename T, typename... Ts>
struct all_int_or_string<T &&, Ts...> : all_int_or_string<T, Ts...> {}
Используется таким образом
template <typename... Args, std::enable_if_t<all_int_or_string<Args...>::value>* = nullptr>
void func(Args&&... args) {
}
Нужно ли отключать шаблон функции или достаточно того, что возникает ошибка компиляции, когда функция используется с неправильными типами? Последнее может быть достигнуто с помощью подходящего объявления
static_assertв теле.