2

に慣れようとしているときに、と一緒boostに使用すると問題が発生しました。私は簡単なことをしようとしています。類似した署名を持つ関数のリストを用意し、サンプルデータでそのすべての関数を使用します。コードは次のとおりです。boost::functionstd::vectorstd::for_each

typedef boost::function<int (const char*)> text_processor;
typedef std::vector<text_processor> text_processors;
text_processors processors;
processors.push_back(std::atoi);
processors.push_back(std::strlen);

const char data[] = "123";

std::for_each(processors.begin(), processors.end(),
    std::cout << boost::bind(&text_processors::value_type::operator(), _1, data) 
              << "\n"
);

それで、for_each私は標準出力にすべての関数をサンプルデータに適用した結果を書き込もうとしています。ただし、このようにコンパイルされることはありません(結果の演算子<<が欠落していることに関する長いメッセージbind)。

ストリーム演算子を削除すると、コンパイル可能ですが役に立たないコードになります。秘訣は、関数の適用とテキスト出力を1つで実行したいということですfor_each。私は何が欠けていますか?ラムダやそのようなsmthを使用すると簡単なはずですが、正しい解決策を見つけることはできません。

4

1 に答える 1

4

コードの問題は、許可されていない方法でファンクターを作成しようとしていることです(の3番目の引数でコードをスローすることはできず、ファンクターfor_eachを渡す必要があります)。

コンパイラでラムダがサポートされていない場合は、次のstd::transform代わりに使用できますstd::for_each(テストされていません...ただし、これは機能するはずです)。

std::transform( processors.begin(), processors.end(),
                std::ostream_iterator<int>( std::cout, "\n" ),
                bind( &text_processors::value_type::operator(), _1, data ) );

コンパイラがラムダをサポートしている場合は、それを使用して実行できます。

const char data[] = "123";
std::for_each(processors.begin(), processors.end(),
    [&data]( text_processors const & ) { 
        std::cout << boost::bind(&text_processors::value_type::operator(), _1, data) 
              << "\n"
    }
);

しかし、その後、bind完全に回避することができます:

std::for_each( processors.begin(), processors.end(),
               [&data]( text_processors::value_type & op ) {
                   std::cout << op( data ) << "\n";
               }
);
于 2011-10-02T21:24:47.200 に答える