2

私はこのようなことをしたいと思います:

boost::regex re("tryme");
ifstream iss;
iss.open("file.txt");
istream_iterator<string> eos;     
istream_iterator<string> iit (iss);

find(iit,eos,bind2nd(boost::regex_match),re));

エラーは次のとおりです。

「bind2nd<_Fn2,_Ty>(bool (*) (BidiIterator,BidiIterator,match_results &,const basic_regex &,unsigned long))」の一致が見つかりませんでした

「find(istream_iterator,int>,istream_iterator,int>,undefined,regex)」に一致するものが見つかりませんでした

正しく行うのを手伝ってもらえますか?ありがとう。

4

1 に答える 1

5

最初の問題は、std::find()値を一致させようとすることです。つまり、 で置き換える必要がありstd::find()ますstd::find_if()。やり方は簡単です。

次の問題は、それboost::regex_matchが 1 つの関数ではなく、一連の関数であることです。std::bind2nd()この家族のどのメンバーと対戦したいのかわかりません。また、明らかに使用したい関数オーバーロードは、2 つではなく 3 つの引数を取ります。型の最後の引数boost::match_flag_typeはデフォルトです。これを使用して動作するようにstd::bind()しました:

std::bind(static_cast<bool (*)(std::string const&,
                               boost::regex const&,
                               boost::match_flag_type)>(&boost::regex_match),
         std::placeholders::_1, re);

本当に使いたい場合std::bind2nd()は、単純な転送関数を作成するのがおそらく最も簡単です:

bool my_regex_match(std::string s, boost::regex const& r) {
    return boost::regex_match(s, r);
}

void f() {
    boost::regex re("tryme");
    std::ifstream iss(file.txt);
    std::find_if(std::istream_iterator<std::string>(iss),
             std::istream_iterator<std::string>(),
             std::bind2nd(std::ptr_fun(&my_regex_match), re));
}

テンプレートは実際にはstd::bind2nd()生の関数ポインターでは機能しません。std::ptr_fun()これが、使用する必要がある理由です。一般に、呼び出された標準関数のいずれかを*_fun()使用する必要がある場合、実際には楽しみが停止します。これらの関数は、参照によって引数を取る関数に対処できません。したがって、引数を値でmy_regex_match()受け取ります。それ以外の場合は、参照への参照を引数として受け取る関数オブジェクトを作成しようとします。これが、 またはを使用するもう 1 つの理由です。std::stringstd::bind2nd()std::bind()boost::bind()

于 2012-10-07T21:41:56.603 に答える