2017-10-15 137 views
0

我想創建一個模板類,它將反過來生成一個函數的包裝。該類將隨後返回包裝。我想用模板具有將與任何功能的工作與不同的簽名,如普通類:使用C++模板與std :: function和std :: bind

  1. std::function<void()>task = std::bind(fun1, param1, param2);
  2. std::function<int(int, int)>task = std::bind(fun2, param1, param2);

我想有這樣的事情:

template <typename T1, typename T2> 
class A { 
    A (string param1, string param2) { 
    // The created wrapper here i.e. 'task' will be returned by the class. 
    function<T1>task = bind(T2, param1, param2); 
    } 

    // Return the created wrapper in the constructor. 
    function<T1> returnWrapper() { 
    return task; 
    } 
}; 

上面的代碼主要是僞代碼,因爲它不能被編譯,但給出了我正在尋找什麼的想法。有沒有解決方案?我認爲應該不僅僅是爲一個函數的簽名使用模板。任何幫助將不勝感激。如果可能的話,我也希望能夠傳遞任意數量的參數來'綁定'。

+0

如果你能做到這一點,你會怎麼稱呼它呢? – aschepler

+0

我沒有編寫完整的僞代碼,但意圖是類將返回包裝器,以便稍後調用它。在這種情況下,班級應該返回'任務'。 – Dan

+1

啊,起初我以爲你想要導致一種常見的非模板類型可以容納任何類型的函數。但是我看到這個類型仍然依賴於函數類型'T1'。 'A(string,string)'是一個構造函數,它不能返回任何東西。你的意思是'任務'會成爲你稍後可以訪問的班級成員?或者,也許可以直接調用「A」類型的對象。 – aschepler

回答

0

我想我解決了這個問題!我不得不定義一個類,該類在模板中使用兩個類型名稱,並在currying後將其中的一個傳遞給std :: function作爲函數簽名,並使用構造函數中的第二個函數在std中定義curried函數(包裝後的結果函數) ::綁定。然後一切正常!可能會有一些更好的解決方案,但這是我得到的最好,或多或少清晰的解決方案。這是我找到的解決方案的片段!希望它可以幫助其他同樣的問題:

#include <iostream> 
#include <functional> 

using namespace std; 

class A { 
    private: 
    template <typename T1, typename T2> 
    class B { 
     private: 
     function<T1>ff; 

     public: 
     B(T2 fun) { 
      ff = bind(fun, 1, placeholders::_1); 
     } 

     virtual ~B() { 
     } 

     int exec(int x) { 
      return ff(x); 
     } 
    }; 

    static int myFun(int x, int y) { 
     return x + y; 
    } 

    public: 
    A() { 
    }; 

    int test() { 
     B<int(int), int (*)(int, int)> b(&myFun); 
     return b.exec(10); 
    } 

    virtual ~A() { 
    }; 
}; 

int main() { 
    A a; 

    // Correct result is '11' since we pass 11 and 1 is in the curried function. 
    cout << "test result: " << a.test() << endl; 

    return 0; 
}