使用bind1st和mem_-fun引用成员函数 我有一个C++类,我尝试使用STD::BDIN1将成员函数绑定到“这个”参数。例如: class MyClass { public: void Foo() { using namespace std; // this works fine this->Bar(); // this also works fine mem_fun( &MyClass::Bar )( this ); // this does not bind1st( mem_fun( &MyClass::Bar ), this )(); // this is not a possibility for this program boost::bind( &MyClass::Bar, this )(); }; void Bar() { }; };

使用bind1st和mem_-fun引用成员函数 我有一个C++类,我尝试使用STD::BDIN1将成员函数绑定到“这个”参数。例如: class MyClass { public: void Foo() { using namespace std; // this works fine this->Bar(); // this also works fine mem_fun( &MyClass::Bar )( this ); // this does not bind1st( mem_fun( &MyClass::Bar ), this )(); // this is not a possibility for this program boost::bind( &MyClass::Bar, this )(); }; void Bar() { }; };,c++,stl,mem-fun,C++,Stl,Mem Fun,添加最后一行“bind1st”时,会出现以下编译器错误: 1>stl/_function.h(189) : error C2039: 'second_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>' 1> with 1> [ 1> _Ret=void, 1> _Tp=MyClass 1>

添加最后一行“bind1st”时,会出现以下编译器错误:

1>stl/_function.h(189) : error C2039: 'second_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>'
1>        with
1>        [
1>            _Ret=void,
1>            _Tp=MyClass
1>        ]
1>        .\MyClass.cpp(50) : see reference to class template instantiation 'stlp_std::binder1st<_Operation>' being compiled
1>        with
1>        [
1>            _Operation=stlp_std::mem_fun_t<void,MyClass>
1>        ]
1>stl/_function.h(189) : error C2146: syntax error : missing ',' before identifier 'second_argument_type'
1>stl/_function.h(189) : error C2065: 'second_argument_type' : undeclared identifier
1>stl/_function.h(190) : error C2955: 'stlp_std::unary_function' : use of class template requires template argument list
1>        stl/_function_base.h(40) : see declaration of 'stlp_std::unary_function'
1>stl/_function.h(191) : error C2039: 'second_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>'
1>        with
1>        [
1>            _Ret=void,
1>            _Tp=MyClass
1>        ]
1>stl/_function.h(191) : error C2146: syntax error : missing ',' before identifier 'second_argument_type'
1>stl/_function.h(191) : error C2065: 'second_argument_type' : undeclared identifier
1>stl/_function.h(194) : error C2955: 'stlp_std::unary_function' : use of class template requires template argument list
1>        stl/_function_base.h(40) : see declaration of 'stlp_std::unary_function'
1>stl/_function.h(195) : error C2955: 'stlp_std::unary_function' : use of class template requires template argument list
1>        stl/_function_base.h(40) : see declaration of 'stlp_std::unary_function'
1>stl/_function.h(197) : error C2146: syntax error : missing ';' before identifier '_ArgParamType'
1>stl/_function.h(197) : error C3254: 'stlp_std::binder1st<_Operation>' : class contains explicit override 'param_type' but does not derive from an interface that contains the function declaration
1>        with
1>        [
1>            _Operation=stlp_std::mem_fun_t<void,MyClass>
1>        ]
1>stl/_function.h(197) : error C2838: 'param_type' : illegal qualified name in member declaration
1>stl/_function.h(197) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(197) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(198) : error C2146: syntax error : missing ';' before identifier '_ConstArgParamType'
1>stl/_function.h(198) : error C3254: 'stlp_std::binder1st<_Operation>' : class contains explicit override 'const_param_type' but does not derive from an interface that contains the function declaration
1>        with
1>        [
1>            _Operation=stlp_std::mem_fun_t<void,MyClass>
1>        ]
1>stl/_function.h(198) : error C2838: 'const_param_type' : illegal qualified name in member declaration
1>stl/_function.h(198) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(198) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(199) : error C2039: 'first_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>'
1>        with
1>        [
1>            _Ret=void,
1>            _Tp=MyClass
1>        ]
1>stl/_function.h(199) : error C2146: syntax error : missing ',' before identifier 'first_argument_type'
1>stl/_function.h(199) : error C2065: 'first_argument_type' : undeclared identifier
1>stl/_function.h(199) : error C2955: 'stlp_std::__call_traits' : use of class template requires template argument list
1>        stl/type_traits.h(452) : see declaration of 'stlp_std::__call_traits'
1>stl/_function.h(203) : error C2039: 'first_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>'
1>        with
1>        [
1>            _Ret=void,
1>            _Tp=MyClass
1>        ]
1>stl/_function.h(203) : error C2146: syntax error : missing ';' before identifier '_M_value'
1>stl/_function.h(203) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(203) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(208) : error C2061: syntax error : identifier '_ConstArgParamType'
1>stl/_function.h(211) : error C2061: syntax error : identifier '_ArgParamType'
1>stl/_function.h(212) : error C2535: '_Result stlp_std::binder1st<_Operation>::operator ()(void) const' : member function already defined or declared
1>        with
1>        [
1>            _Operation=stlp_std::mem_fun_t<void,MyClass>
1>        ]
1>        stl/_function.h(208) : see declaration of 'stlp_std::binder1st<_Operation>::operator ()'
1>        with
1>        [
1>            _Operation=stlp_std::mem_fun_t<void,MyClass>
1>        ]

我认为它不起作用,因为
bind1st()
需要一个二进制函数对象并返回一元函数对象。由于
Bar()
不接受任何参数,
mem\u fun()
将为您提供一元函数对象
bind1st()
不知道该怎么办


您实际上打算如何使用由
mem_fun()
生成的函数对象?

您想用bind1st实现什么

bind1st
函数接受一个二进制函数,并通过使第一个参数隐式(对不起,这可能不是最好的描述)将其调整为一元函数。
mem_fun
的返回值是一元函数

mem\u fun
函数返回成员函数的适配器。调整后的函数不接受任何参数,尽管适配器返回一个参数,即指向要使用的MyClass对象的指针

因此,基本上,您的
mem_-fun
调用返回一个带一个参数的适配器,但是
bind1st
需要一个带两个参数的适配器。有一个
mem_fun1
,它返回一个适配器,该适配器接受两个参数,第一个是对象指针,第二个是函数的参数,但这不是您想要的

事实上,我不太明白你想做什么;为什么普通的
mem_-fun
版本不合适?如果您需要将对象指针“附加”到适配器,我不认为您可以使用当前的标准库来实现,除非您使用bind

当然,您可以创建一个保存对象指针的包装器类,然后只需定义操作符()即可使用该对象调用适配器

// Quick and dirty example of this.
// You could extend this with a second template parameter for return type, if
// needed. Just be sure to specialize for void if you do that.
template<typename Object>
struct bound_mem_fun_t { 
    bound_mem_fun_t(mem_fun_t<void, Object> f, Object* o) : fun(f), obj(o) { } 
    void operator()() { fun(obj); } 
    mem_fun_t<void, Object> fun; 
    Object* obj; 
};

MyClass a;
bound_mem_fun_t<MyClass> func(mem_fun(&MyClass::Bar), &a);
func();
//这是一个又快又脏的例子。
//如果需要的话,您可以使用第二个返回类型模板参数来扩展它
//需要。如果你这样做的话,一定要专门针对void。
模板
结构绑定\u mem\u fun\u t{
绑定(mem_fun_t f,Object*o):fun(f),obj(o){}
void操作符(){fun(obj);}
mem_fun_t fun;
对象*obj;
};
我的a级;
绑定函数(mem_-fun(&MyClass::Bar),&a);
func();

bind1st
需要一个二进制函数,并返回一元函子。这里,传递一元函数

“绑定”的目的是通过将二元函数/函子的一个参数设置为给定值来使用二元函数/函子(就像具有一个参数的非静态方法一样)

这将起作用(请注意新的
Bar
)原型:


我想添加另一个可能的解决方案,那就是使用C++11中的lambda函数

下面是一个简单的例子:

class MyClass
{
    std::string mName;

public:
   MyClass(const char* name) : mName(name) {};

   void Foo()
   {
       std::cout << "My name is " << mName << std::endl;
   };
};

void CallMyFn(std::function<void()> fn)
{
    fn();
}

int main()
{
    MyClass myInstance("Ishmael");

    CallMyFn( [&]() { myInstance.Foo(); } );

    return 0;
}
class-MyClass
{
std::字符串mName;
公众:
MyClass(const char*name):mName(name){};
void Foo()
{

std::我想问题是,如何获取一元函数对象,并通过将其绑定到一个参数生成一个空函数对象。例如,bind1st的一个版本,但用于少一个arity的函数对象。在这种情况下,空函数对象在调用时将调用
this->Bar()
获取绑定时使用的
this
的值。是的,我认为不使用
bind
无法完成此操作。您可以创建一个简单的包装器来完成此操作,就像我在回答中提到的那样,但除此之外,我认为标准库没有任何其他内置方法。
class MyClass
{
public:
   void Foo()
   {
       using namespace std;

       // this works fine
       bind1st( mem_fun( &MyClass::Bar ), this )(42);
   };

   void Bar(int i)
   {
   };
};
class MyClass
{
    std::string mName;

public:
   MyClass(const char* name) : mName(name) {};

   void Foo()
   {
       std::cout << "My name is " << mName << std::endl;
   };
};

void CallMyFn(std::function<void()> fn)
{
    fn();
}

int main()
{
    MyClass myInstance("Ishmael");

    CallMyFn( [&]() { myInstance.Foo(); } );

    return 0;
}