- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想专攻std::iterator_traits<>
对于 不 具有通常的嵌套 typedef(如 value_type
、difference_type
等)的容器类模板的迭代器,我不应该修改其源代码。基本上我想做这样的事情:
template <typename T> struct iterator_traits<typename Container<T>::iterator>
{
typedef T value_type;
// etc.
};
除了这不起作用,因为编译器无法推断出 T
来自 Container<T>::iterator
.
有什么可行的方法可以达到同样的目的吗?
例如:
template <typename T>
class SomeContainerFromAThirdPartyLib
{
typedef T ValueType; // not value_type!
// no difference_type
class iterator
{
typedef T ValueType; // not value_type!
// no difference_type
...
};
iterator begin() { ... }
iterator end() { ... }
...
};
现在假设我调用 std::count()
使用此类的实例。据我所知,在大多数 STL 实现中,count()
返回 iterator_traits<Iterator>::difference_type
. iterator_traits<I>
的主模板简单地做 typedef typename I::difference_type difference_type
.与其他嵌套类型相同。
现在在我们的示例中这显然行不通,因为没有 Container::iterator::difference_type
.我想我可以在不修改迭代器类的情况下解决这个问题,方法是专门化 iterator_traits
对于任何 Container<T>
的迭代器.
最后,我只是希望能够使用std 算法,如count、find、sort 等,最好不修改任何现有代码。我认为 iterator_traits
的重点正是这样:能够为不支持内置的迭代器类型指定类型(如 value_type
、 diff_type
等)。不幸的是,我无法弄清楚如何为 Container<T>
的所有实例专门化特征类。 .
最佳答案
是的。编译器无法推断出 T
来自 Container<T>::iterator
因为它是不可推导的上下文,换句话说,给定Container<T>::iterator
, T
的值不能唯一可靠地推导出来(参见 this for detail explanation)。
这个问题的唯一解决办法是你必须完全专门化iterator_traits
对于 iterator
的每个可能值你打算在你的程序中使用。没有通用的解决方案,因为您不允许编辑 Container<T>
类模板。
关于c++ - 特化 iterator_traits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7927764/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!