1

C / C ++(おそらくC ++ 11より前)で、それは可能ですか

A (*eval(A (*function)(B), B b))(){ 
  // ... ??
}

つまり、関数を取る

  1. B値からA値を返す関数、
  2. その関数に供給される B 値、

which returns - () から A を返す関数 ...??

はいの場合、そうでしょうか

  • 効率的??
  • 返された関数の呼び出しの前に実行されないコードをコンパイラが生成することを保証しますか??

前もって感謝します & 乾杯, ニック

2014-4-20 (1): 'evtl.'(修正済み) std::bind について言及していただきありがとうございます。:-)

したがって、理解するために、(Boost を使用しない C/pre C++11 では) 関数ポインターは例外的であり、functions 内ではそれらを宣言することしかできませんが、インスタンスを生成または変更する方法はありません。関数/メソッド定義は、関数ポインター インスタンスの唯一の可能なソースであり、そこから明示的に、または関数/メソッド引数によって渡される可能性があります??

関数ポインターの内部表現の可能性について明確ではないので、ただ尋ねます...

2014-4-20 (2): Danvil の貢献により、目的を明らかにする時が来ました。ここではテンプレートと同じです:

template<typename T,typename A>
struct Evaluator {
  T(*f)(A);
  A a;
  T operator()() const { return f(a); }
};

template<typename T,typename A>
Evaluator<T,A> eval(T(*f)(A), A a) {
  Evaluator<T,A> w;
  w.f= f; w.a= a;
  return w;
}

これは機能しますが、一部の人はすでに推測しているように、任意の一致する関数/引数のコレクションからの全体が、try/catch に似た実行を処理する単一の関数/メソッドにゼロ パラメーター プロシージャとして送信されることを意図しています。

異なるパラメーター数ごとにほとんど同じコードを使用する必要がないため、実際のアイデアは、すべてのケースで同じタイプのゼロパラメータープロシージャーとしてまだ実行されていないジョブを生成することでした。

それでも、関数内で関数ポインターを作成または変更する方法がわかりません。何らかの方法で評価者に「タイプキャスティング」することは実際的ではないようですよね??

繰り返しになりますが、どうもありがとうございました。ハッピーイースター... :-)

4

2 に答える 2

5

を探していると思いますstd::bind。この名前std::bindは新しいもので、以前は Boost の一部でした。

#include <functional>

std::function<A (void)> curry(A (*fn)(B), B b)
{
    return std::bind(fn, b);
}
于 2014-04-19T21:17:04.673 に答える
0

C++11 がなければ、次のように動作します。

typedef A(*Func)(B);

struct Evaluator {
    Func f;
    B b;
    A operator()() const
    { return f(b); }
};

Evaluator eval(Func f, B b) {
    Evaluator w;
    w.f = f;
    w.b = b;
    return w;
}

それが本質的std::bindにやっていることなので、std::bindできれば使ってください。

于 2014-04-20T12:54:16.507 に答える