作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个模板函数,以便在给定对象已存在于容器中时返回 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/
我是一名优秀的程序员,十分优秀!