C ++函数指针返回类型

时间:2016-09-17 18:43:47

标签: c++ function templates callback function-pointers

给出以下类(只是标题):

class Example {

public:

    template<class C>
    Example(bool(C::*callbackFunc)(Foo&) = nullptr) : callbackFunc(callbackFunc);

    template<class C>
    ??? getCallbackFunc() const {
        return callbackFunc;
    }

private:

    // store the func ptr
    template<class C>
    bool (C::*callbackFunc)(Foo&);
};

getter getCallbackFunc()的正确返回类型是什么?

2 个答案:

答案 0 :(得分:4)

您的问题的答案是:

document.addEventListener("deviceready", function () {
  $cordovaPlugin.someFunction().then(success, error);
}, false);

但是,这对您没有多大帮助,因为您无法在类实例中存储模板变量:

bool(C::*)(Foo&)

这不是一个合法的变量声明,你真的无法解决它。

template<class C> bool (C::*callbackFunc)(Foo&); 替换为

callbackFunc

然后在std::function< bool(void*, Foo&) > callbackFunc; ctor中编写一个将成员ptr转换为这样一个函数的函数。它涉及从Examplevoid*的静态演员。

获取回调函数返回:

C*

来自std::function< bool(C*, Foo&) >

是隐式收敛的

您可以通过传递callbackFuncC*

来使用它

答案 1 :(得分:1)

你的第一个问题是,如果没有模仿整个类,就不能有模板化的成员变量。修复后,我们可以尝试使用The Right Left Rule计算getCallbackFunc函数的返回值。我为你的构造函数添加了一个body,因为你提供了一个init-list(内联构造函数)。

struct Foo {};

// need to template the whole class to
// template member variables
template<class C>
class Example {

public:

    Example(bool(C::*callbackFunc)(Foo&) = nullptr)
    : callbackFunc(callbackFunc) {} // init list means this needs a body

    // use the right-left-rule 
    bool (C::*getCallbackFunc())(Foo&) {
        return callbackFunc;
    }

private:

    // store the func ptr
    bool (C::*callbackFunc)(Foo&);
};

class CallbackClass
{
public:
    bool call_me_back(Foo&) { std::cout << "Glad you called" << '\n'; return true; }
};

int main()
{
    Example<CallbackClass> eg(&CallbackClass::call_me_back);

    CallbackClass cbc; // instantiate something to call

    Foo foo; // need a foo for parameter

    // get fn pointer, dereference it and call it with cbc object
    bool return_value = (cbc.*eg.getCallbackFunc())(foo);
}

使用using声明创建类型别名可以稍微简化一下:

struct Foo {};

// create a templated type alias
template<typename C>
using CallbackType = bool(C::*)(Foo&);

// need to template the whole class to
// template member variables
template<class C>
class Example {

public:

    Example(CallbackType<C> callbackFunc = nullptr)
    : callbackFunc(callbackFunc) {} // init list means this needs a body

    // using the type alias
    CallbackType<C> getCallbackFunc() {
        return callbackFunc;
    }

private:

    // store the func ptr
    CallbackType<C> callbackFunc;
};

class CallbackClass
{
public:
    bool call_me_back(Foo&) { std::cout << "Glad you called" << '\n'; return true; }
};

int main()
{
    Example<CallbackClass> eg(&CallbackClass::call_me_back);

    CallbackClass cbc; // instantiate something to call

    Foo foo; // need a foo for parameter

    // get fn pointer
    CallbackType<CallbackClass> cb = eg.getCallbackFunc();

    // dereference it and call it with cbc object
    bool return_value = (cbc.*cb)(foo);
}