将指向函数的指针指定给函数对象的指针地址 < C++中有可能吗? 例如,我有一个指向不带参数的函数的指针,其返回类型为void: void (*f)();
和函数对象:将指向函数的指针指定给函数对象的指针地址 < C++中有可能吗? 例如,我有一个指向不带参数的函数的指针,其返回类型为void: void (*f)();,c++,pointers,function-pointers,functor,C++,Pointers,Function Pointers,Functor,和函数对象: class A { public: void operator()() { cout << "functor\n"; } }; 我得到C:\Users\iuliuh\qtests\functor\u test\main.cpp:15:错误:C2440:“=”:无法从“A*”转换为“void(u cdecl*)(void)” 没有可以进行此转换的上下文 有什么方法可以实现这一点吗?是的,可以使用C++1/C++0x功能,但要实现这一点,您应该使用std::fun
class A
{
public:
void operator()() { cout << "functor\n"; }
};
我得到C:\Users\iuliuh\qtests\functor\u test\main.cpp:15:错误:C2440:“=”:无法从“A*”转换为“void(u cdecl*)(void)”
没有可以进行此转换的上下文
有什么方法可以实现这一点吗?是的,可以使用C++1/C++0x功能,但要实现这一点,您应该使用std::function,它可以处理两种类型的函数和对象函数
#include <functional>
class A
{
public:
void operator()() { }
};
int main()
{
std::function<void(void)> aFunction;
A ob;
aFunction = ob;
// or as another user said
// aFunction = std::bind(&A:operator(), &ob);
aFunction();
void (*f)();
aFunction = f;
aFunction();
return 0;
}
#包括
甲级
{
公众:
void运算符()({}
};
int main()
{
std::函数a函数;
产科医生;
a功能=ob;
//或者像另一个用户说的那样
//affunction=std::bind(&A:operator(),&ob);
函数();
无效(*f)();
a函数=f;
函数();
返回0;
}
如果你坚持使用C++03,你可以使用
std::mem_-fun
和std::ptr_-fun
你不能按照你指定的方式来做,因为:
std::function<void(void)> f = std::bind(&A::operator(), &ob);
std::function f=std::bind(&A::operator(),&ob);
(请参见在成员函数上使用std::function)如果使用C++11,可以使用
#包括
std::函数f;
int main()
{
产科医生;
ob();
f=ob;//f表示ob
f();//调用ob();
返回0;
}
像这样的解决方法怎么样:
A a;
MyFncPtr myPtr(&Base::operator(), &a);
myPtr.invoke();
MyFncPtr myPtr2(function);
myPtr2.invoke();
基本上,您希望有一种调用成员函数和函数的通用方法。然后,也许您可以创建一个包装器来表示指向函数或成员函数的通用指针。假设您有Base
类,并且希望能够调用所有派生类的operator()
。然后您还需要调用一个函数()
:
class Base
{
public:
virtual void operator()() = 0;
};
class A : public Base
{
public:
void operator()(){ std::cout << "A()" << std::endl; }
};
void function()
{
std::cout << "function" << std::endl;
}
你可以这样做:
A a;
MyFncPtr myPtr(&Base::operator(), &a);
myPtr.invoke();
MyFncPtr myPtr2(function);
myPtr2.invoke();
产出:
A()
function
希望这有帮助:)你能不能只使用
std::function
?有没有办法用旧的标准,也就是c++11之前的标准?请注意,最终的解决方案是一个概念。当原始代码< >代码> BaseObj>代码>被破坏时,你应该考虑到悬空指针的问题,当原始代码< >代码> BaseObj/<代码>被破坏时,可以使用智能指针,使它成为更合适的解决方案:)++1,用于不使用新的C++ 11特性的工作。谢谢大家!@约翰史密斯:不客气:)是的,我想指出的是,除了那些依赖C++0x/C++11;)的解决方案之外,还有其他的解决方案
A a;
MyFncPtr myPtr(&Base::operator(), &a);
myPtr.invoke();
MyFncPtr myPtr2(function);
myPtr2.invoke();
A()
function