C++确定容器是否具有 ::find()
C++ determine if a container has ::find()
我有一个函子,它在类型 U
的容器上运行 T
类型的元素,如下所示
template<typename T, template<typename...> class U>
class asserter
{
public:
asserter(U<T> &c) : container(c) { };
void operator()(T lhs)
{
CU_ASSERT(container.find(lhs) != container.end());
};
private:
U<T> &container;
};
我可能会将其用作
std::set<std::string> a, c;
...
asserter<std::string, std::set> ass(c);
for_each(a.begin(), a.end(), ass);
我们暂时忽略std::includes()
。
如果容器是定义U::find()
的容器,则此方法非常有用。如果不是,我想回到std::find()
.另一方面,如果可用,我宁愿使用U::find()
而不是std::find()
。
在 C++11(或 17,如有必要(中,我可以确定U::find()
是否可用(可能仅限于 STL(供您使用,如果是,请使用它,否则请使用std::find()
?
SFINAE 关于表达式c.find(value)
是否格式正确。尾随返回类型是 C++11,无论如何在这里都不是必需的;它只是使返回类型更容易编写 - decltype(c.find(value))
而不是decltype(std::declval<Container&>().find(std::declval<const T&>()))
.
如果表达式格式不正确,则会从重载集中删除 find_impl
的第一个重载,将第二个重载保留为唯一可行的重载。第三个参数的常用int/long/0
技巧使第一个重载在两个都可行时首选。
template<class Container, class T>
auto find_impl(Container& c, const T& value, int) -> decltype(c.find(value)){
return c.find(value);
}
template<class Container, class T>
auto find_impl(Container& c, const T& value, long) -> decltype(std::begin(c)){
return std::find(std::begin(c), std::end(c), value);
}
template<class Container, class T>
auto find(Container& c, const T& value) -> decltype(find_impl(c, value, 0)) {
return find_impl(c, value, 0);
}
通常的免责声明适用:这依赖于表达 SFINAE,MSVC 目前不支持该表达式;Microsoft确实计划在 MSVC 2015 的更新中添加支持。
相关文章:
- std::map::find 的效率是否与值的数据大小有关?
- 是否可以覆盖 "find" 和 "erase" boost::bimaps::bimap.left 的方法?怎么办?
- std::find是否隐式修复无效参数
- std::find on empty vector 是否会导致未定义的行为
- 用于 str.find() 的size_t数据类型是否安全?
- 是否可以使用字符串::find来检测换行符
- 使用 str.find() 查看单词中是否有特定字母
- 是否可以在 Linux 中使用"man std::find"?
- std::find返回vec.end(),而不管值是否在vector中
- std::string find是否要求pos小于字符串大小
- 对于空输入字符串,string::find的行为是否定义良好?
- 是否存在std::search对应的函数,就像std::count对应std::find一样
- C++确定容器是否具有 ::find()
- 检查字符串是否以另一个字符串开头:find或compare
- 检查在vector的vector中搜索时std::find是否失败
- 如何检查_bstr_t是否包含字符串(类似于str.find)
- 使用find搜索字符串中是否存在空白
- std::<classtype>set.find(element) 是否使用类中的 == 运算符来比较元素?
- 如果找不到任何内容,Serial.find 是否会清除缓冲区
- std::unordered_multiset::find函数是否返回具有相同哈希值的两个值之间的第一个插入元素