6

私はこれの結果を置きたいです:

std::tr1::mem_fn(&ClassA::method);

変数の内部では、この変数のタイプは何ですか?

これは次のようになります。

MagicalType fun = std::tr1::mem_fn(&ClassA::method);

また、結果のタイプはstd::tr1::bind何ですか?

ありがとうございました !

4

3 に答える 3

5

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));
于 2010-08-02T18:00:51.107 に答える
3

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);
于 2010-08-02T18:04:39.460 に答える
0

この関数は次の方法で実装できます(したがって、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;
}
于 2015-09-29T13:15:47.253 に答える