2016-10-23 6 views
4

Я пытаюсь отключить функцию, если какой-либо тип класса списка передается в функцию со следующим enable_ifПопытка отключить функцию, если какой-либо тип списка передается в

template <typename ContainerType, typename KeyType, 
      typename = std::enable_if_t<!std::is_same< 
      std::decay_t<ContainerType>, 
      std::list<typename ContainerType::value_type>>::value>> 
void func(ContainerType&& container, KeyType&& key) 

Но когда я называю FUNC с vector<int> я получаю ошибку

candidate template ignored: substitution failure [with ContainerType = std::__1::vector<int, std::__1::allocator<int> > &, KeyType = int]: type 'std::__1::vector<int, std::__1::allocator<int> > &' cannot be used prior to '::' because it has no 
    members 

вектор имеет элемент ЬурейеГо value_type, чтобы получить значение вещей, хранящихся в нем ..

Любая идея, как я могу это исправить?

+1

'зОго :: enable_if' должен быть, возможно,' зОго :: enable_if_t'? – StoryTeller

+0

@StoryTeller Хороший глаз! Но это не исправило ошибку :( – Curious

ответ

8

Прямая задача здесь:

std::list<typename ContainerType::value_type>>::value>> 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

В вашем примере, ContainerType тип ссылки (std::vector<int>&), и вы не можете получить доступ от определений типов ссылочного типа. Сначала вам нужно удалить ссылку.

Но мы можем сделать это проще, просто игнорируя KeyType части:

template <class X> struct is_list : std::false_type { }; 
template <class T, class A> struct is_list<std::list<T,A>> : std::true_type { }; 

template <class Container, class Key, 
    std::enable_if_t<!is_list<std::decay_t<Container>>::value>* = nullptr> 
void func(ContainerType&&, Key&&) { ... } 
5

Основание моего ответа на this SO сообщение. Лучший подход будет выглядеть следующим образом:

#include <type_traits> 

template<template<typename...> class TT, typename T> 
struct is_instantiation_of : std::false_type { }; 

template<template<typename...> class TT, typename... Ts> 
struct is_instantiation_of<TT, TT<Ts...>> : std::true_type { }; 

template <typename ContainerType, typename KeyType, 
      typename = std::enable_if_t<!is_instantiation_of< 
      std::list, std::decay_t<ContainerType>>::value>> 
void func(ContainerType&& container, KeyType&& key) 

Основным преимуществом этого является то, что faffing вокруг с остальными параметрами типа std::list сек не позволит обойти чек.

+0

Я бы согласился с этим ответом, но тот, который был выше, объясняет, почему у меня была ошибка, поэтому я собираюсь пойти на это, я поддержал это, хотя. – Curious

 Смежные вопросы

  • Нет связанных вопросов^_^