c++ - 遍历通用 STL 容器以检查是否存在

标签 c++ templates c++11 stl

我正在尝试编写一个模板函数,以便在给定对象已存在于容器中时返回 true。这就是我所在的地方,我不知道从这里到哪里去。

 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;
}

虽然我也尝试在模板规范行中使用 std::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

最佳答案

 std::decay(decltype(*bit))

std::decay 不是函数;它是一个元函数。 IE:带有 ::type 的结构成员(或 ::value 用于产生值的元函数)。无论如何,您不能通过传递类型来调用常规函数。

您可以使用 typename std::decay<decltype(*bit)>::type 调用元函数. typename部分相当重要。

C++14 之前的版本,您可以通过创建快速别名模板来缩短代码:

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

C++14 使该部分成为所有类型元函数的标准库。

关于c++ - 遍历通用 STL 容器以检查是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38820260/

相关文章:

c++ - 使用 std::array 创建树

c++ - 动态查找中位数而不用 C++ 为 O(n) 保存观察值

c++ - 模板参数列表中参数 3 的类型/值不匹配

c++ - 使用 Variadic 模板的任意维数组

c++ - 如何在模板中为类型引入名称别名

c++ - 您可以根据大小及其内容生成可变模板包吗?

c++ - 模板中类型别名的继承

c++ - 如何反转元组类型中元素类型的顺序?

c++ - 在 C++ 中复制对象

c++ - 使用 C++11 线程对非常量引用进行无效初始化?