std :: tr1 :: mem_fn тип возвращаемого значения - PullRequest
5 голосов
/ 02 августа 2010

Я хочу поместить результат этого:

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

Каков тип этой переменной внутри переменной?

Это будет выглядеть примерно так:1007 *

Кроме того, каков тип результата std::tr1::bind?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 02 августа 2010

Типы возврата как 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));
2 голосов
/ 02 августа 2010

Тип возврата 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);
0 голосов
/ 29 сентября 2015

Функция может быть реализована следующим образом (таким образом, вы также видите тип возвращаемого значения): Вы можете попробовать этот фрагмент кода здесь http://webcompiler.cloudapp.net/. К сожалению, он использует шаблоны с переменным числом https://en.wikipedia.org/wiki/Variadic_templateкоторые являются только частью стандарта C ++ 11.

 #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;
}
...