(C ++新手)保存一个稍后可以调用的函数指针

时间:2018-02-05 11:49:37

标签: c++ templates

我花了一些时间试图弄清楚如何做到这一点,但我想我需要帮助。如果我可以使用模板,我可以避免输入函数,比如' B :: theFuncToBeCalled',对吧?但是,只有在我没有弄错的情况下才能使用静态方法?

// A.h
typedef std::function <void()> CbType;

class A
{
    template<typename T>
        void setCallback(T &cb);

    private:
        template <typename T>
        T callThisLater;
};

// A.cpp
template<typename T>
void A::setCallback(T &cb)
{
    this->callThisLater = cb;

    // later...

   ((CbType*)callThisLater)();
}

// B.cpp
// in constructor or wherever
{
    A* a;
    a->setCallback(this->theFuncToBeCalled);

    // or, anonymous
    CbType func = [this](){
        // do something
        // call theFuncToBeCalled() if I feel like it :)
    };

    a->setCallback(func);
}

void B::theFuncToBeCalled()
{
    log("yay");
}

(如果我以匿名的方式尝试这样做,我会收到访问冲突错误。)

2 个答案:

答案 0 :(得分:0)

这里有很多错误。让我们讨论一下,然后再解决它:

  1. 您不能简单地在实现文件中定义模板化函数:https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl
  2. variable templates仅适用于静态变量:
  3.   

    变量模板定义一系列变量或静态数据成员

    1. 您正在传递一个方法,并尝试使用它,就好像您传递了一个函数一样,methods implicitly take the this parameter
    2. 一旦callThisLater的类型被定义为接受一个方法,就不能随后将其更改为接受具有不同签名的lambda
    3. class A很难重新实现可以用仿函数解决的问题,甚至只是函数指针
    4. 请简单地删除class A并使用函数指针和闭包类型:

      auto a = &B::theFuncToBeCalled;
      auto func = [=]() { (*this.*a)(); }
      

      而不是使用a继续前进,只需使用func

      即可

答案 1 :(得分:0)

我决定改变我的方法而不是保存指向回调的指针,而是保存指向成员函数所属对象的指针。它的工作量相同,但如果我需要调用几个不同的成员函数,我可以这样做:

objRef->theFuncToBeCalled();

// later
objRef->theOtherFuncToBeCalled();

我需要的只是一个指针。简单就是Best™,amiright? :)谢谢你的帮助!