我正在尝试使用boost::counting_iterator
的Incrementable类型。
迭代器适用于Incrementable类型的boost::counting_iterator
documentation says,即CopyConstructible,Assignable,PreIncrementable和EqualityComparable类型。
我的可增量类型:
template<class T> struct Incrementable {
// CopyConstructible:
Incrementable() : value(0) {}
Incrementable(const Incrementable& other) : value(other.value) {}
explicit Incrementable(const T& other) : value(other) {}
// Assignable:
inline Incrementable& operator=(const Incrementable& other) {
value = other.value;
return *this;
}
// PreIncrementable:
inline Incrementable& operator++() {
++value;
return *this;
}
// EqualityComparable:
friend
inline bool operator==(const Incrementable& a, const Incrementable& b) {
return a.value == b.value;
}
T value;
};
无法编译:
#include <boost/iterator/counting_iterator.hpp>
#include "incrementable.h"
int main() {
boost::counting_iterator<Incrementable<int>> a(Incrementable<int>(0));
return 0;
}
错误:
usr/local/include/boost/iterator/iterator_categories.hpp:161:60: error: no type named 'iterator_category' in 'boost::detail::iterator_traits<Incrementable<int> >'
typename boost::detail::iterator_traits<Iterator>::iterator_category
我猜我需要为:
实现iterator_category文档中没有明确说明(完全省略了这个主题),我在库的其他部分找不到任何关于它的信息。
所以我将以下内容添加到boost::detail
命名空间:
namespace boost { namespace detail {
template <class T> struct is_numeric<Incrementable<T>>
: mpl::true_ {};
}} // boost::detail namespace
现在一切都按预期编译和工作。尽管如此,我确实怀疑该库是否打算以这种方式使用。
任何人都知道正确/干净的方式来实现它吗?
Steve Jessop的建议:专攻std::numeric_limits
也有效:
namespace std {
template<class T>
class numeric_limits<Incrementable<T>> : public numeric_limits<T> {
public:
static const bool is_specialized = true;
};
}
我仍然不知道这对于可递增类型是否正确。
答案 0 :(得分:4)
我不确定Boost是否定义了&#34;可递增类型&#34;正如你所说。如果确实按照你的说法定义了它,那么就会出现文档错误,它不应该说counting_iterator
适用于&#34;任何可递增的类型&#34;,因为它们不是&#39;整个要求。或者我认为如果你正确指定其他模板参数&#34;它是真的。不言而喻。
Incrementable
counting_iterator
模板参数的要求在您链接到的文档中给出(从&#34开始; iterator_category
定义如下...&#34 ;,因为实际需求部分返回iterator_category
)。
你不应该专攻boost::detail::is_numeric
。你应该专攻std::numeric_limits
。但是在你的例子中,我认为你实际上已经过多地缩小了T
的界面,声称你的类型是数字的(它没有算术)。如果您的类型既不是数字也不是迭代器,我认为您应该将CategoryOrTraversal
指定为forward_iterator_tag
。我可能错过了一些东西。