2

Boost.Phoenix を使用して、数行のコードで構成され、値を「返す」ラムダ関数を作成して、std::transform.

このような:

std::transform(a.begin(), a.end(), b.begin(),
        (
            //Do something complicated here with the elements of a:
            statement1,
            statement2,
            statement3
            //Is there a way to return a value here?
        )
        );

これstd::for_eachを使用すると完全に機能std::transformしますが、コンマ演算子が を返すため、コンパイルできませんvoid。このようなラムダ関数から値を返すにはどうすればよいですか?


編集:最初に書いたことが自分のやりたいことについて誤解を招いたため、コードフラグメントを変更しました。

4

2 に答える 2

1

関数型プログラミングでは、状態を変更することは意図されていません。ただし、 を使用する代わりに、 を使用for_eachすることもできますaccumulate。累積とは、「開始値」(例: m=1,n=0) と、値を出力値に「追加」する関数があることを意味します。

#include <vector>

struct MN { int m, n; 
  MN(int m,int n):m(m),n(n){}
  static MN accumulate( MN accumulator, int value ) {
     return MN( accumulator.m + value, accumulator.n * value );
  }
}; // your 'state'

int main(){
  std::vector<int> v(10,10); // { 10, 10, ... }
  MN result = std::accumulate( v.begin(), v.end(), MN(0,1), MN::accumulate );
  printf("%d %d", result.m, result.n );
}

私はフェニックスに慣れていませんが、おそらくMN::accumulateそれに関して関数を定義する方法があります。

于 2011-05-24T18:49:11.890 に答える
1

いいえ、これは不可能です。Boost.Phoenix v2ステートメントのドキュメントから:

遅延関数や遅延演算子とは異なり、遅延ステートメントは常に void を返します。

(これと同じアサーションが Boost.Phoenix v3 ドキュメントにもあることに注意してください。)

于 2011-05-24T17:49:47.993 に答える