2016-12-21 17 views
9

私は開始と終了イテレータを取得するための機能を持つオブジェクトを持っています。開始と終了のイテレータから範囲を作成するにはどうすればよいですか?

const_iterator err_begin() const 
const_iterator err_end() const 

彼らはbeginendを命名されていないので、私は範囲-v3では関数に直接私のオブジェクトを渡すことはできません。

このオブジェクトをrange-v3ライブラリで使用できるようにするための単純なラッパーはありますか?例えば

auto hasErrors = !empty(something(x.err_begin(), x.err_end())); 
+0

これら2つの関数をそれぞれ呼び出す 'begin()'と 'end()'を追加しますか? –

+0

オブジェクトはライブラリの一部です。メソッド名を変更したり、新しいメソッドを追加することはできません。 – sdgfsdh

+0

あなたが話している単純なラッパーを作成して、開始と終了の呼び出しを必要なものにマップします。 – mascoj

答えて

9

あなたがiterator_rangeを探しているような音:

auto hasErrors = !empty(ranges::make_iterator_range(x.err_begin(), x.err_end())); 
+4

iterator_rangeのドキュメントはこちら[https://ericniebler.github.io/range-v3/structranges_1_1v3_1_1iterator__range.html]にあります。 'ranges :: make_iterator_range(x.err_begin()、x.err_end())'を呼ぶだけです。 –

+0

コードから 'iterator_range'と' make_iterator_range'を見つけることができません。彼らは名前が変更されましたか? – kaba

4

あなたは、問題のクラスを使用すると、変更することはできませんライブラリの一部であることを明らかにしました。ファイン。ファサードクラスを作成します。

class FacadeClass { 

     const RealClassWithErrBeginEnd &r; 

public: 

     FacadeClass(const RealClassWithErrBeginEnd &r) : r(r) {} 

     auto begin() const { return r.err_begin(); } 
     auto end() const { return r.err_end(); } 
}; 

これは、コンテナを必要とするほとんどのコードを欺くのに十分なはずです。最悪のケースでは、など、すなわちvalue_type、ファサードに追加のtypedefを提供する必要があるかもしれません...

+0

このタイプは[Regular](http://stackoverflow.com/a/14000046/195873)ではありません。それは、range-v3ライブラリの残りの部分ではうまくいきません。以下のBrianの答えが正解です。 (私はrange-v3、FWIWの著者です) –

0

boost::make_iterator_rangeは正しいことを行います。少しのADLを追加すると、1つのフリー関数がすべての問題を解決することが分かります:

#include <vector> 
#include <iostream> 
#include <string> 
#include <boost/range.hpp> 


// simulate the library class 
struct X 
{ 
    auto err_begin() const { return errors.begin(); } 
    auto err_end() const { return errors.end(); } 

    std::vector<std::string> errors; 

}; 

// provide a generator to build an iterator range 
auto errors(const X& x) 
{ 
    return boost::make_iterator_range(x.err_begin(), x.err_end()); 
} 

// do things with the iterator_range 
int main() 
{ 
    X x; 
    for (const auto& err : errors(x)) 
    { 
     std::cout << err << std::endl; 
    } 

    std::cout << empty(errors(x)) << std::endl; 
} 
関連する問題