gpt4 book ai didi

c++ - 使用 bind1st 和 mem_fun 引用成员函数

转载 作者:可可西里 更新时间:2023-11-01 16:37:08 24 4
gpt4 key购买 nike

我有一个 C++ 类,我在其中尝试使用 std::bind1st 将成员函数绑定(bind)到“this”参数。例如:

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”行时,出现以下编译器错误:

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> ]

我正在使用 STLPort v5.2.1 来实现标准库。

通常,我会切换到 boost::bind 并使用它。不幸的是,对于这个应用程序来说,这是不可能的。

我该怎么做才能获得我正在寻找的功能?

谢谢,保罗H


编辑:更清楚地说,我正在寻找一种方法来使一元函数适应您所谓的不带参数的函数。我想将 this“绑定(bind)”到 MyClass::Bar

class SomeOtherClass
{
public:
template< typename Fcn >
void ExecuteFcn( Fcn fcn )
{
fcn();
};
};

some_other_class.ExecuteFcn( bind1st( mem_fun( &MyClass::Bar ), this );

最佳答案

你想用 bind1st 完成什么?

bind1st 函数接受一个二元函数,并通过使第一个参数隐式使其适应一元函数(这可能不是最好的描述,抱歉)。 mem_fun 的返回值是一元函数。

mem_fun 函数返回成员函数的适配器。改编后的函数不接受任何参数,但返回的适配器接受一个参数,即指向要使用的 MyClass 对象的指针。

所以,基本上,您的 mem_fun 调用返回一个接受一个参数的适配器,但是 bind1st 期望一个接受两个参数的适配器。有一个 mem_fun1 返回一个带有两个参数的适配器,第一个是对象指针,第二个是函数的参数,但这不是你想要的。

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

当然,您可以创建一个包含对象指针的包装类,然后只需定义 operator() 以使用该对象调用适配器。

// 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();

关于c++ - 使用 bind1st 和 mem_fun 引用成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3399773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com