1

std::for_eachループで反復されているマップがあります。ネストされたバインドと単純なヘルパー関数を使用して、必要なペアの要素にアクセスしています。これは、C++11 より前のコードから使用できる必要があります。

typedef std::map<int, Foo> MapType;

std::for_each( 
    testMap.begin() , 
    testMap.end() , 
    std::bind( 
      &Foo::myIncredibleFunction ,  
      std::bind( 
          &ValueExtractor< MapType::key_type , MapType::mapped_type >::getValue, 
          std::placeholders::_1 )));

これはうまく機能します(ただし、洗練される可能性はあると思います)

また、現在のコード ベースを現在のレベルから C++11 に移行する予定なので、言語の新機能を使用してコード (読みやすさ、効率) を改善できるかどうかを検討しています。たとえば、私は次のことを試しました(失敗しました - 以下のテンプレートエラーを参照してください)

std::for_each( 
    testMap.begin() , 
    testMap.end() , 
    std::bind( 
        &Foo::myIncredibleFunction ,  
        std::get<1>(  std::placeholders::_1 )));

エラー

    1>d:\projects\test_bind\test_bind\test_bind.cpp(48): error C2780:
    std::bind ...<Snip>...
    : expects 6 arguments - 2 provided

また、インテリセンスには次のものがあります。

IntelliSense: no instance of overloaded function "std::get" matches the argument list
argument types are: (std::_Ph<1>)   

の使用法をさまざまに組み合わせstd:get<1>()て、内部バインドを置き換えようとしましたが、成功しませんでした。これを正しく理解できていないのではないかと思いますが、やりたいことができるはずだと感じています。std::getヘルパー関数/ファンクターなしで呼び出しを使用してこれを行う方法はありますか?

編集: KennyTM は、コードで実際に行っていることに関して、私の答えを思いついたと思います。それは私のアプローチよりもはるかに優れています。std::get<>上記で使用できるかどうか、またはなぜ使用できないかについては、まだ興味があります。

4

2 に答える 2