Тест C ++ для контейнеров через SFINAE - PullRequest
0 голосов
/ 06 апреля 2020

В C ++ 17 я пытаюсь обнаружить контейнеры (карты), проверяя наличие value_type (mapped_type). Тем не менее, хотя он работает для unordered_set<int>, он не работает для unordered_set<int*>, что я считаю странным Можете ли вы сказать мне, почему и как это сделать правильно?

  template<class N, class T = int>
  struct is_container { static const bool value = false; };
  template<class N>
  struct is_container<N, typename N::value_type> { static const bool value = true; };
  template<class N>
  static constexpr bool is_container_v = is_container<remove_reference_t<N>>::value;


int main()
{
  cout << is_container_v<unordered_set<int>&> << '\n';
  cout << is_container_v<unordered_set<int*>&> << '\n';
}

вывод:

1
0

PS: я видел этот вопрос , который фильтрует по присутствию begin(), но это не помогает сказать map из set.

1 Ответ

3 голосов
/ 06 апреля 2020

При сохранении теста оно должно быть

template<class N, class Enabler = void>
struct is_container { static const bool value = false; };

template<class N>
struct is_container<N, std::void_t<typename N::value_type>>
{ static const bool value = true; };

template<class N>
static constexpr bool is_container_v = is_container<remove_reference_t<N>>::value;

Как и в вашей версии

is_container_v<unordered_set<int*>&> равно is_container<unordered_set<int*>> и по умолчанию: is_container<unordered_set<int*>, int>

тогда как ты специализируешься на is_container<unordered_set<int*>, int*> ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...