我尝试让这段代码运行。我几乎在那里,但我遇到了问题:
_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;
}
提前致谢。
答案 0 :(得分: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)
};
(在这种情况下无关紧要,但从长远来看,这种风格更安全。)
答案 1 :(得分: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
}