2016-08-08 4 views
1

Я пытаюсь написать функцию шаблона для возврата true, если данный объект уже существует в контейнере. Здесь я нахожусь, и я не знаю, куда идти отсюда.Traverse Generic STL Container для проверки наличия

template <typename BeginningIter, typename EndingIter, typename T> 
static bool itemExists(BeginningIter bit, EndingIter eit, const T &searchTerm) 
{ 
    if ((bit == nullptr) || (eit == nullptr)) { 
     return false; 
    } 
    static_assert(std::is_same<std::decay(decltype(*bit)), std::decay(searchTerm)>::value, "Invalid"); 
    for (auto iter = bit; iter != eit; iter++) { 
     if (*iter == searchTerm) { 
      return true; 
     } 
    } 
    return false; 
} 

Я также, хотя попытаться использовать зЬй :: enable_if в спецификации шаблона линии, но я не знаю способ, чтобы получить тип разыменовано термина BeginningIter. Я использовал std :: decay в случае, если он указывал на ссылочный тип. Однако, при попытке компиляции, я получаю

generalutilities.h: In static member function ‘static bool GeneralUtilities::itemExists(BeginningIter, EndingIter, const T&)’: 
generalutilities.h:148:77: error: template argument 1 is invalid 
     if (!std::is_same<std::decay(decltype(*bit)), std::decay(searchTerm)>::value) { 
                      ^
generalutilities.h:148:77: error: template argument 2 is invalid 
+2

«* Я пытаюсь написать функцию шаблона, чтобы вернуть true, если данный объект уже существует в контейнере. *« FYI: у нас уже есть один из них. [Он называется 'find'] (http://en.cppreference.com/w/cpp/algorithm/find). И это намного лучше, чем ваше, поскольку оно возвращает местоположение, где оно было найдено, и не требует, чтобы тип элемента в контейнере был точного типа, как то, что вы ищете. –

+2

Да, я знаю о поиске. Я пытаюсь выучить десятины. –

+0

'if (! Std :: is_same <...> :: значение) {std :: cout <<" Не то же самое "<< std :: endl; } 'Вероятно, это должно быть' static_assert' – KABoissonneault

ответ

1
std::decay(decltype(*bit)) 

std::decay не является функцией; это метафокус. IE: структура с членом ::type (или ::value для metafunction, которые приводят к значениям). И вы не можете вызывать обычные функции, передавая тип в любом случае.

Вы называете metafunction его использованием typename std::decay<decltype(*bit)>::type. Часть typename весьма важна.

Pre-C++ 14, вы бы сделать код короче, создавая быстрый шаблон псевдоним:

template<typename T> using decay_t = typename std::decay<T>::type; 

C++ 14 делает эту часть стандартной библиотеки для всех метафункции типа.

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