2016-12-31 7 views
1

タイトルが少し混乱する可能性があるので、より明確に説明します。異なるパラメータを持つ関数を関数パラメータとして使用する方法

Iは次のようにクラスがある:

class foo 
{ 
public: 

    foo(%Some function% *) { %Some function pointer% = %Some function%; } 

    %Some output% callFunction(%Some input%); 

private: 

    %Some function pointer% bar; 
} 

好ましくは、I、クラス全体で使用される%Some function pointer%で与えられた関数を記憶できるようにしたいが、これは必要ではありません。

だから私の主な質問は: は、どのように私はそれがパラメータを機能とともに、入力として内の任意の機能を取ることができ、実際のcallFunctionを作成することができますか?

ご協力いただきましてありがとうございます。

+0

おそらくこのようなものです:http://stackoverflow.com/questions/17805969/writing-universal-memoization-function-in-c11 –

+0

明確にするために、 'foo :: callFunction'が与えられた引数を取るようにします。それは '%Some input%'であり、それらの引数に沿って 'bar'を呼び出し、' bar'が返すものを返すようにしたいとしますか? IOW、パススルー/プロキシ機能のようなもの? – greatwolf

+0

@greatwolfはい、それは私が達成しようとしていることですが、私はそれをどうするかについては正確には分かりません。 – 0x22fe

答えて

1

返品とパラメータの種類を知る必要があります。クラスまたはテンプレートパラメータで固定されています。

はここでクラスに固定の例です:

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はまだ異なるタイプのインスタンスです。テンプレートパラメータは、控除によって隠されます。

+0

これはすばらしい答えです!あなたの助けと、C++ 17のヒントをありがとう。 – 0x22fe

関連する問題