Я ищу способ использовать SFINAE для реализации некоторой функции, которая должна быть доступна только для некоторых контейнеров: вектор, список, массив (установлено ниже только в качестве теста)
Основываясь на этом ответе, я попробовал приведенный ниже код, в котором используется класс признаков, возвращающий true только для необходимых контейнеров.
Как вы можете видеть здесь, это не удается для std::array
.
template <typename Container>
struct is_container : std::false_type { };
template <typename... Ts> struct is_container<std::array<Ts... >> : std::true_type { };
template <typename... Ts> struct is_container<std::vector<Ts...>> : std::true_type { };
template <typename... Ts> struct is_container<std::set<Ts... >> : std::true_type { };
template <typename... Ts> struct is_container<std::list<Ts... >> : std::true_type { };
template <typename... Ts> struct Dummy{};
int main()
{
std::cout << "Dummy: " << is_container<Dummy<int>>::value << '\n';
std::cout << "array: " << is_container<std::array<int,5>>::value << '\n';
std::cout << "vector:" << is_container<std::vector<int>>::value << '\n';
std::cout << "set: " << is_container<std::set<int>>::value << '\n';
std::cout << "list: " << is_container<std::list<int>>::value << '\n';
}
Насколько я понимаю, это связано с тем, что std::array
требует второго параметра шаблона. У меня мало опыта работы с вариативными шаблонами, поэтому мой вопрос:
Есть ли способ сделать этот подход успешным? Или мне следует использовать другой подход, описанный в связанном вопросе?
Я бы предпочел что-то чистое C++11, но C++14 тоже подойдет.
c++11
, но он был перемежен с другим редактированием, которое уже добавило максимум 5 тегов. Имхо, было бы неплохо иметь тегc++11
, но не хотелось решать, что еще удалить - person 463035818_is_not_a_number   schedule 23.06.2021