返品とパラメータの種類を知る必要があります。クラスまたはテンプレートパラメータで固定されています。
はここでクラスに固定の例です:
struct foo {
foo(std::function<int(std::string, double)> func) : bar{std::move(func)} {}
int callFunction(std::string s, double d) {
bar(std::move(s), d);
}
private:
std::function<int(std::string, double)> bar;
};
このメソッドは関数ポインタを許可しないだけでなく、任意の関数のようなオブジェクトも、ラムダのような。
あなたは種類が固定されたくない場合は、あなたがラップしたい関数オブジェクトの種類を指定するためのテンプレートを使用することができます。
template<typename F>
struct foo {
foo(F func) : bar{std::move(func)} {}
template<typename... Args>
auto callFunction(Args&&... args) -> decltype(bar(std::declval<Args>()...)) {
return bar(std::forward<Args>(args)...);
}
private:
F bar;
};
template<typename F>
auto make_foo(F f) {
return foo<F>{std::move(f)};
}
この方法は、任意の関数や機能を可能にstd::function
のオーバーヘッドをドラッグしないため、他のソリューションよりも高速です。ここでの欠点は、先にC++ 17のmake_foo
を使用する必要があることです。
auto f1 = make_foo([](int i){ return i * 1.5; });
auto f2 = make_foo([]{});
double result = f1.callFunction(12);
f2.callFunction();
あなたがC++ 17のためのスイッチの上に反転した場合、その後、あなたはそれを書くことができます:あなたはこのように、上記の溶液を使用することができます
f1
こと
foo f1 = [](int i){ return i * 1.5; };
foo f2 = []{};
double result = f1.callFunction(12);
f2.callFunction();
注意とf2
はまだ異なるタイプのインスタンスです。テンプレートパラメータは、控除によって隠されます。
おそらくこのようなものです:http://stackoverflow.com/questions/17805969/writing-universal-memoization-function-in-c11 –
明確にするために、 'foo :: callFunction'が与えられた引数を取るようにします。それは '%Some input%'であり、それらの引数に沿って 'bar'を呼び出し、' bar'が返すものを返すようにしたいとしますか? IOW、パススルー/プロキシ機能のようなもの? – greatwolf
@greatwolfはい、それは私が達成しようとしていることですが、私はそれをどうするかについては正確には分かりません。 – 0x22fe