4
我的問題類似於this。 'Karrek SB的回答實際上對我有所幫助。 我有這些類:通用成員函數指針作爲另一個類中的模板參數
Base.h:
class Base{
public:
Base(){}
virtual ~Base(){}
virtual void init() = 0;
};
A1.h:
#include <iostream>
#include "Base.h"
using namespace std;
class A1 : public Base{
public:
A1(){}
virtual ~A1(){};
virtual void init(){
cout << "A1::init() called" << endl;
}
void f1(){
cout << "Im in A1::f1" << endl;
}
void f2(int val){
cout << "Im in A1::f2 with val: " << val << endl;
}
};
我有另一個類,應該是能夠存儲任何普通的成員函數與任何類型和參數的數量。這個類看起來是這樣的:
MFholder.h:
#include <functional>
#include <deque>
using namespace std;
class MFHolder{
public:
MFHolder(){};
~MFHolder(){};
template<typename T, typename R, typename ... Args>
R addMF(T & obj, R (T::*pf)(Args ...), Args&& ... args){
mfp.push_back(function<void()>(bind(pf, &obj, forward<Args>(args) ...)));
}
void runTasks(){
while(!mfp.empty()){
auto task = mfp.front();
mfp.pop_front();
task();
}
}
private:
deque< function<void()> > mfp;
};
現在我想一些成員函數從主添加到MFHolder這樣的: main.cpp中:
#include "A1.h"
#include "MFHolder.h"
int main(){
MFHolder mfh;
A1 a1Obj;
//A2 a2Obj; //this should also work
int val = 42;
//mfh.addMF(a1Obj, &A1::f1); //this should also work
mfh.addMF(a1Obj, &A1::f2, val);
//add some more function calls here...
//run all the tasks
mfh.runTasks();
return 0;
}
編譯我的代碼時出現以下錯誤。
no matching function for call to
'MFHolder::addMF(A1&, void (A1::*)(int), int&)'
和候選是:
template<class T, class R, class ... Args> R MFHolder::addMF(T&, R (T::*)(Args ...), Args&& ...)
Thx提前! :)
作爲一種快速解決方法,您可以嘗試'mfh.addMFC(a1Obj,&A1 :: f2,static_cast(val));'。否則,你也可以擺脫轉發語義,並且總是擁有const引用。 –
2013-03-18 17:57:35
你可以改變它接受std :: function,或者你只是試圖避免讓用戶鍵入呼叫綁定? – metal 2013-03-18 18:07:40
@KerrekSB,現在我得到「錯誤:沒有匹配函數調用'MFHolder :: addMF(A1&,void(A1 :: *)(int),const int&)'」。 – hfm 2013-03-18 18:09:45