C / C ++(おそらくC ++ 11より前)で、それは可能ですか
A (*eval(A (*function)(B), B b))(){
// ... ??
}
つまり、関数を取る
- B値からA値を返す関数、
- その関数に供給される 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 に似た実行を処理する単一の関数/メソッドにゼロ パラメーター プロシージャとして送信されることを意図しています。
異なるパラメーター数ごとにほとんど同じコードを使用する必要がないため、実際のアイデアは、すべてのケースで同じタイプのゼロパラメータープロシージャーとしてまだ実行されていないジョブを生成することでした。
それでも、関数内で関数ポインターを作成または変更する方法がわかりません。何らかの方法で評価者に「タイプキャスティング」することは実際的ではないようですよね??
繰り返しになりますが、どうもありがとうございました。ハッピーイースター... :-)