将指向函数的指针指定给函数对象的指针地址 < 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

你不能按照你指定的方式来做,因为:

  • 运算符()必须是非静态函数(标准要求)
  • 指向非静态函数的指针必须具有隐式参数—指向类实例的指针
  • 对f()的调用不会给出调用函数的对象A的哪个实例的任何指示
  • 正如Stephane Rolland指出的那样,使用C++11和std::function可能会达到目的——您将在绑定中指定指向对象的指针:

    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