他の型との厳密な弱い順序付けを定義するクラスがあり、そのクラスのコンテナー (std::upper_bound など) で比較ベースのアルゴリズムを使用したいと考えています。
標準では、コンテナーの前方反復子の値の型は、同等の型のものでなければならないと定義しているため、次のコードはコンパイルされません。
template<typename T>
class Foo {
public:
bool operator<(const T& _val) { return val < _val; }
//operator T() { return val; } // uncommenting this solves the problem
private:
T val;
};
void bar() {
vector<Foo<int>> foos(10);
auto i_lb = std::lower_bound(foos.begin(), foos.end(), 17); // compiles and works, though I don't know why
auto i_eq = std::equal_range(foos.begin(), foos.end(), 17); // error! not convertible to int
}
述語を受け入れるアルゴリズム バージョンを使用する方法が見つかりませんでした (型が同じである必要もあります)。変換演算子を定義すると、この例が機能しますが、定義することが常に正しいとは限りません。そのような比較作業を行う正しい方法は何ですか?
ちなみに、 std::equal_range を std::lower_bound に置き換えると機能しますが、理由がわかりません。