5


1

std :: tr1 :: mem_fn戻り値の型

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

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

変数内で、この変数の型は何ですか?

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

MagicalType fun = std::tr1::mem_fn(&ClassA::method);
また、 `std

tr1 :: bind`の結果の型は何ですか?

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

3 Answer


5


`std

tr1 :: mem_fn`と` std :: tr1 :: bind`の両方の戻り値の型は指定されていません。

`std

tr1 :: bind`の結果を` std :: tr1 :: function`に保存できます:

struct ClassA {
    void Func() { }
};

ClassA obj;
std::tr1::function bound_memfun(std::tr1::bind(&ClassA::Func, obj));
`std

tr1 :: mem_fn`の結果を` std :: tr1 :: function`に保存することもできます:

std::tr1::function memfun_wrap(std::tr1::mem_fn(&ClassA::Func));


2


mem_fn`と bind`の戻り値の型は_unspecified_です。 つまり、引数に応じて異なる種類のオブジェクトが返され、標準ではこの機能の実装方法の詳細が規定されていません。

特定のライブラリ実装で特定のケースのタイプが何かを知りたい場合(理論的には、私は願っています)、常にエラーを引き起こし、エラーメッセージからタイプを取得できます。 E.g:

#include

struct X
{
    double method(float);
};

int x = std::mem_fn(&X::method);

9 Untitled.cpp cannot convert 'std::_Mem_fn' to 'int' in initialization

この場合、型の名前は内部使用のために予約されていることに注意してください。 コードでは、先頭にアンダースコア(および大文字)を使用しないでください。

C ++ 0xでは、戻り値の型は `auto`になると思います:)

auto fun = std::mem_fn(&ClassA::method);


0


この関数は、次の方法で実装できます(したがって、戻り値の型も表示されます)。このコードは、http://webcompiler.cloudapp.net/で試すことができます。 残念ながら、C ++ 11標準の一部にすぎない変数テンプレートhttps://en.wikipedia.org/wiki/Variadic_templateを使用しています。

 #include
#include

template  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  MemFunFunctor my_mem_fn( R (T::*fp)(Args... ) )
{
    return MemFunFunctor(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;
}