私はこれの結果を置きたいです:
std::tr1::mem_fn(&ClassA::method);
変数の内部では、この変数のタイプは何ですか?
これは次のようになります。
MagicalType fun = std::tr1::mem_fn(&ClassA::method);
また、結果のタイプはstd::tr1::bind
何ですか?
ありがとうございました !
std::tr1::mem_fn
との両方の戻りタイプstd::tr1::bind
は指定されていません。
std::tr1::bind
の結果をstd::tr1::function
:に保存できます。
struct ClassA {
void Func() { }
};
ClassA obj;
std::tr1::function<void()> bound_memfun(std::tr1::bind(&ClassA::Func, obj));
std::tr1::mem_fn
の結果をstd::tr1::function
:に保存することもできます。
std::tr1::function<void(ClassA&)> memfun_wrap(std::tr1::mem_fn(&ClassA::Func));
mem_fn
およびの戻りタイプbind
は指定されていません。つまり、引数に応じて異なる種類のオブジェクトが返され、標準ではこの機能を実装する方法の詳細が規定されていません。
特定のライブラリ実装で特定の場合にタイプが何であるかを知りたい場合(理論的には、私は願っています)、いつでもエラーを引き起こし、エラーメッセージからタイプを取得できます。例えば:
#include <functional>
struct X
{
double method(float);
};
int x = std::mem_fn(&X::method);
9 Untitled.cpp cannot convert 'std::_Mem_fn<double (X::*)(float)>' to 'int' in initialization
この場合、タイプの名前は内部使用のために予約されていることに注意してください。コードでは、先頭にアンダースコア(および大文字)が付いたものは使用しないでください。
C ++ 0xでは、戻り型はauto
:)になると思います。
auto fun = std::mem_fn(&ClassA::method);
この関数は次の方法で実装できます(したがって、returnタイプも表示されます)。このコードはhttp://webcompiler.cloudapp.net/で試すことができます。残念ながら、 C++11標準の一部にすぎない可変個引数テンプレートhttps://en.wikipedia.org/wiki/Variadic_templateを使用します。
#include <iostream>
#include <string>
template <class R, class T, class... Args > class MemFunFunctor
{
private:
R (T::*mfp)(Args... ); //Pointer to a member function of T which returns something of type R and taking an arbitrary number of arguments of any type
public:
explicit MemFunFunctor(R (T::*fp)(Args... ) ):mfp(fp) {}
R operator()(T* t, Args... parameters)
{
(t->*mfp)(parameters... );
}
};
template <class R,class T, class... Args> MemFunFunctor<R,T,Args... > my_mem_fn( R (T::*fp)(Args... ) )
{
return MemFunFunctor<R,T,Args... >(fp);
}
class Foo //Test class
{
public:
void someFunction(int i, double d, const std::string& s )
{
std::cout << i << " " << d << " " << s << std::endl;
}
};
int main() //Testing the above code
{
Foo foo;
auto f = my_mem_fn(&Foo::someFunction);
f(&foo, 4, 6.7, "Hello World!" ); //same as foo.someFunction(4, 6.7, "Hello World!");
return 0;
}