none
TR1 の bind でコンパイルエラー RRS feed

  • 質問

  • TR1 の話で申し訳ないのですが、VC2008 SP1 で以下のコードがコンパイルできませんでした。
    (1の位を無視してソートするというサンプルですが、それ自体に意味はありません)

    int buf[] = { 13, 25, 22, 14, 8 };
    stable_sort(buf, buf + 5, bind(
        less<int>(),
        bind(divides<int>(), _1, 10),
        bind(divides<int>(), _2, 10)));

    エラーの内容から推測して、コードを以下のように書き換えたらコンパイルできたのですが、どうも納得できていません。

    int buf[] = { 13, 25, 22, 14, 8 };
    stable_sort(buf, buf + 5, bind(
        less<int>(),
        bind(divides<int>(), _1, 10),
        bind(divides<const int>(), _2, 10)));

    私の bind の使い方に何か問題があるのでしょうか?
    それとも、VC2008 の実装の方に問題があるのでしょうか?
    2009年2月2日 4:53

回答

  • zakio の発言:

    それとも、VC2008 の実装の方に問題があるのでしょうか?

    こっちだと思います。http://www.boost.org/ のboost::bind()を使用するとコンパイルが通りますし。
    ただ、boostを使うならlambdaを使ってしまいます…。
    #include <boost/lambda/lambda.hpp>  
    using namespace boost::lambda;  
    int buf[] = { 13, 25, 22, 14, 8 };  
    stable_sort(buf, buf + 5, _1 / 10 < _2 / 10); 
    • 回答としてマーク zakio 2009年2月4日 0:55
    2009年2月2日 8:06

すべての返信

  • zakio の発言:

    それとも、VC2008 の実装の方に問題があるのでしょうか?

    こっちだと思います。http://www.boost.org/ のboost::bind()を使用するとコンパイルが通りますし。
    ただ、boostを使うならlambdaを使ってしまいます…。
    #include <boost/lambda/lambda.hpp>  
    using namespace boost::lambda;  
    int buf[] = { 13, 25, 22, 14, 8 };  
    stable_sort(buf, buf + 5, _1 / 10 < _2 / 10); 
    • 回答としてマーク zakio 2009年2月4日 0:55
    2009年2月2日 8:06
  • ありがとうございます。
    同じ意見の人が一人でもいると心強いです。

    たしか tr1::bind は boost::bind がそのまま採用されたはず、と思っていたら _1 とかが placeholders に移動していたので、ひょっとしたら他にも何か変更が入ったのかなと疑問に思っていました。
    bind は引数を束縛するという機能だけでなく Boost.Compose の機能も備えた素敵なライブラリなので、標準化されるのを心待ちにしています。

    余談ですが、確かにこの場合は lambda ですね。
    今回の例は見事に「lambda を使うと、こんなコードがこんなにスッキリ書ける」というサンプルになってしまいました。
    # 実は bind を試す前に、stable_sort(buf, buf + 5, [] (int lhs, int rhs) { return (lhs / 10) < (rhs / 10); }); とやって玉砕済みだったりしてます。
    • 編集済み zakio 2009年2月3日 1:21 文法ミス
    2009年2月3日 1:18