で 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;
};
}
これがインクリメンタル型に対して正しいことかどうかはまだわかりません。