给出以下类(只是标题):
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()
的正确返回类型是什么?
答案 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转换为这样一个函数的函数。它涉及从Example
到void*
的静态演员。
获取回调函数返回:
C*
来自std::function< bool(C*, Foo&) >
。
您可以通过传递callbackFunc
和C*
。
答案 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);
}