将成员函数传递给create_free_function boost指针

3

我试图让这段代码运行起来。我已经接近成功,但是卡在了这一行:

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

首先请理解我不想改任何代码,只想改变构造函数。为什么?因为我想学习。最终我想编写一个包装器类Func,可以以同样的方式处理自由函数和成员函数。

那么在std::mem_func()调用中,我需要将什么作为第一个参数呢?我尝试了很多方法。

可能这是一个重复的问题,但我不知道如何搜索这个问题。我缺乏词汇。如果有人能指向一个教程或其他东西,帮助我表达这个问题,我也会感激不尽。

以下是完整的示例代码:

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

感谢您的提前帮助。

如果你正在学习编程,不妨看看boost::bind——一切都会豁然开朗的。 - Nim
这个例子来自于 boost 函数文档。在这里,他们没有在这种情况下使用 boost:bind。如果您能将我遇到的问题行更改为一个(简单的)boost::bind()-调用,我很乐意了解它。 - AudioDroid
2个回答

4

看起来你只是忘了一个括号:

_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)
};

(在这种情况下并不重要,但从长远来看,这种风格更加安全。)

谢谢,就这样。我怎么会搞错呢……也许我应该休息一下。;-) 我只能在3分钟后将您的答案标记为正确。请确保我会这样做。 - AudioDroid
@AudioDroid:我不能怪你。GCC的第一个错误是“no matching function for call to ‘mem_fun(int (X::&)(int), X&)’”,而不是缺少括号的纯语法错误。 - Fred Foo
我刚刚将这个示例扩展为一个带有两个整数参数的函数(例如sum()),但简而言之,它现在完全不起作用了。 :-( 我会再试一会儿,然后可能会开另一个问题。 - AudioDroid

1

我会稍微重构一下类,使用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
}

这也是一个不错的想法,但我想保持所有“boost stuff”的隐藏。不过还是谢谢你关注这个问题。 - AudioDroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接