簡単に言えば、関数オブジェクト/ lambdaとメンバ関数を簡素化して簡潔に定義する方法はありますか?メンバ関数を持つC++ 11でstd :: function/mem_fnを使用する
私はSTDを使用している場合、私は、右理解していれば:: mem_fnの、私は関数呼び出しに正しい型のオブジェクトを渡す必要があり、すなわち
Object o;
ftncall std::mem_fun(&Object::function);
ftncall(o);
理想的には、「添付するいくつかの方法があるでしょう'o
をその関数オブジェクトに(おそらくstd::weak_ptr
)、削除されたかどうかわかります。漠然とこのような何かを行う方法があった場合たとえば、:
Object o;
ftncall std::mem_fn(&Object::function, o); // Or maybe std::mem_fn<Object>
ftncall();
は、明らかに、これは(私の知る限りでは)存在しません。 Std :: mem_fnの一般性(そして素敵さ)を失わないように、std :: mem_fnをラップする方法はありますか?o
を「アタッチ」することはできますが、他の関数タイプと同様にうまくいきます。 std :: function?理想的には、std :: functionのやり方ではまだoperator()
を使用することができます。
template<class T>
class MemFunWrapper {
public:
MemFunWrapper(T* t, std::mem_fun funct) : m_t(t), m_function(funct) {}
std::mem_fun operator*() { return m_function; }
T* get() { return m_t; }
private:
T* m_t;
std::mem_fun m_function;
}
次に、あなたは以下のようなものを、それを使用することができます:
(*MemFunWrapper)(MemFunWrapper->get(), args...);
しかし、それは私にはかなり扱いにくいと思われるが
現在、私は考えることができる最善の解決策は、次のようになりますクラスです。また、std :: functionと同等のクラスを作成する必要があります。これは、同様の方法で使用することができます。理想的には、メンバー関数または正規関数を呼び出すかどうかを知らずに最終製品を使用することもできます。私は多くを求めていることを知っています - どの方向性が役立つでしょう。どうもありがとう!
どうもありがとうございます - あなたは私の希望と夢をすべて満たしているかもしれません! –
'auto fn = std :: bind(&Object :: member、o);' auto fn = std :: bind(&Object :: member、&o); '、' std: :bind' –
あなたの意図にもよりますが、両方とも状況が違うと便利です – goji