Я пытаюсь написать функцию шаблона для возврата 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
«* Я пытаюсь написать функцию шаблона, чтобы вернуть true, если данный объект уже существует в контейнере. *« FYI: у нас уже есть один из них. [Он называется 'find'] (http://en.cppreference.com/w/cpp/algorithm/find). И это намного лучше, чем ваше, поскольку оно возвращает местоположение, где оно было найдено, и не требует, чтобы тип элемента в контейнере был точного типа, как то, что вы ищете. –
Да, я знаю о поиске. Я пытаюсь выучить десятины. –
'if (! Std :: is_same <...> :: значение) {std :: cout <<" Не то же самое "<< std :: endl; } 'Вероятно, это должно быть' static_assert' – KABoissonneault