2013-03-18 152 views
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提前! :)

+0

作爲一種快速解決方法,您可以嘗試'mfh.addMFC(a1Obj,&A1 :: f2,static_cast (val));'。否則,你也可以擺脫轉發語義,並且總是擁有const引用。 – 2013-03-18 17:57:35

+0

你可以改變它接受std :: function,或者你只是試圖避免讓用戶鍵入呼叫綁定? – metal 2013-03-18 18:07:40

+0

@KerrekSB,現在我得到「錯誤:沒有匹配函數調用'MFHolder :: addMF(A1&,void(A1 :: *)(int),const int&)'」。 – hfm 2013-03-18 18:09:45

回答

1

在您調用addMF的定義中更改參數& &至參數&或更改val以移動(val)。

相關問題