我正在尝试将 Incrementable 类型与boost::counting_iterator
.
boost::counting_iterator
文档说迭代器适用于 Incrementable 类型,即 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 :
- 我的 Incrementable 类型的counting_iterator,
- 或者正如错误所说,对于我的 Incrementable 类型(这是否有意义?我的 Incrementable 类型不是迭代器)。
从文档中也不清楚(完全省略了这个主题),我在图书馆的其他部分找不到任何关于它的信息。
所以我在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;
};
}
我仍然不知道这对于可递增类型是否是正确的做法。