0

ファンクターを作成するには、不要なボイラー プレートが必要です。状態は 4 回書き込む必要があります。

struct f{
  double s; // 1st
  f(double state): s(state) {} // 2nd, 3rd and 4th
  double operator() (double x) {
    return x*s;
  }
};

double functor(state)(x){ return x*state; }ちょうどまたは似たようなマクロを備えたライブラリはありますか。

BOOST_FOREACHうまく機能するマクロアダプターです。似たようなものを探しています。

書き方に関する提案も大歓迎です。

ps。ファンクターに構造体を使用する方が高速で、クラスの operator() をバインドするか、関数をファンクターとしてバインドしますか?

アップデート(1)

ラムダに関して:

ファンクターはモジュール式でなければなりません。つまり、他の関数で再利用できる必要があります。ラムダは関数内にある必要があります-ラムダはメインから呼び出されるメインにある必要があり、メイン外の他の関数はメインで定義されたラムダを呼び出すことはできません。

4

4 に答える 4

4

集計の初期化に頼るのはどうですか? コンストラクターを宣言しないでください。

struct f {
    double s;
    double operator()(double x) {
        return x * s;
    }
};

このように使用します

int main()
{       
    auto ff = f{42};
    std::cout << ff(2);
    return 0;
}
于 2013-08-11T20:48:39.130 に答える
0

マクロについて言及しているように、まさにあなたが探しているものと思われるBOOST_LOCAL_FUNCTIONを見てください:)

double s = 42;
double BOOST_LOCAL_FUNCTION(bind& s, double x) {
  return x*s;
} BOOST_LOCAL_FUNCTION_NAME(f)

個人的なメモ: 最新のコンパイラを使用している場合は、C++11 ラムダを使用してください。

于 2013-08-11T21:47:08.753 に答える