Передайте функцию-член, чтобы создать бесплатный указатель функции - PullRequest
3 голосов
/ 08 июля 2011

Я пытаюсь запустить этот код.Я почти на месте, но я застрял в строке:

 _f = std::bind1st(
         std::mem_fun(f, x);

Прежде всего, пожалуйста, поймите, что я не хочу менять код, но конструктор .Зачем?Потому что я хочу учиться.В конце концов я хочу написать класс-оболочку Func, который может обрабатывать свободные функции и функции-члены одновременно, таким же образом.

Итак, что я должен указать в качестве первого аргумента внутри std::mem_func() -Call ???Я перепробовал множество вещей.

Возможно, это дубликат, но я не знаю, как искать эту проблему.Мне не хватает словарного запаса.Если кто-то может указать на учебник или что-то, что поможет мне выразить эту проблему, я был бы также признателен.

Вот полный пример кода:

#include <boost/function.hpp>
#include <iostream>

struct X
{
    int foo(int i)
    {
        return i;
    };
};

class Func
{

public:

   Func(X *x,  int (X::* f) (int))
   {
      _f = std::bind1st(
         std::mem_fun(f, x);

      std::cout << _f(5); // Call x.foo(5)
   };

private:

    boost::function<int (int)> _f;
};

int main()
{

    X x;

    Func func(&x, &X::foo);
    return 0;
}

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Кажется, вы просто забыли парен:

_f = std::bind1st(std::mem_fun(f), x);

Хотя я бы инициализировал с

Func(X *x,  int (X::* f) (int))
  : _f(std::bind1st(std::mem_fun(f), x))
{
    std::cout << _f(5); // Call x.foo(5)
};

(В данном случае это не имеет значения, но этот стиль безопаснеев долгосрочной перспективе.)

1 голос
/ 08 июля 2011

Я бы немного реорганизовал класс, чтобы использовать boost::function в интерфейсе, и тогда пользователь может решить, как связать самым общим способом:

struct X {
    int foo(int i) { return i; };
};
class Func {
    boost::function<int (int)> _f;
public:
   Func( boost::function<int (int)> f ){
      _f = f;
      std::cout << _f(5);
   };
};
int foo( int x ) { return 2*x; }
int bar( int x, int multiplier ) { return x*multiplier; }
int main() {
    X x;
    Func func1( boost::bind( &X::foo, &x, _1 ) ); // this does the magic
    Func func2( boost::bind( &foo, _1 ) );        // you can also bind free functions...
    Func func3( boost::bind( &bar, _1, 5 ) );     // or with different arguments
}
...