2014-04-29 79 views
-1

我想實現相當於std :: function的函數。它應該通過指向函數來創建函子。第一種模板應該是函數的返回類型,下一個將是參數的類型。不過,我想用可變數量的參數來支持函數。這裏是我到目前爲止的代碼:C++實現std :: function與模板

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <functional> 

using namespace std; 

template< typename T, typename... A > 
struct create_functor 
{ 
    template < typename T (*function)(A) > // here I get an error 
    struct functor 
    { 
     T operator()(A... arguments) 
     { 
      return function(arguments); 
     } 
    }; 
}; 

bool less_than(const int& a, const int& b) 
{ 
    return a < b; 
} 

create_functor< bool, const int&, const int& >::functor< &less_than > less_than_int; 

//auto less_than_int_a = std::function< bool(int,int) >(less_than); 

int main() 
{ 
    vector<int> sample; 
    sample.push_back(1); 
    sample.push_back(0); 
    sample.push_back(3); 
    sample.push_back(-1); 
    sample.push_back(-5); 

    sort(sample.begin(), sample.end(), less_than_int); 

    for(int a : sample) 
    { 
     cout << a << " "; 
    } 

    cout << endl; 

    return 0; 
} 

看來我有麻煩傳遞參數包從外到內的模板(這需要函數指針)

如何通過一個可變數量的任何想法類型的函數聲明將不勝感激。

謝謝:)

+0

它沒有任何意義,'less_than'是一個函數指針,不是類型,你不能將函數指針作爲類型傳遞給模板參數 –

+0

是的,但是我設法爲bool(int,int)函數創建了這個專用化以同樣的方式:http://pastie.org/9123706。我猜模板應該把指針指向函數。 – GeneralFailure

+0

你是什麼意思? [它不會編譯](http://coliru.stacked-crooked.com/a/9751798572bebe3e) –

回答

0

變化

template < typename T (*function)(A) > 

template < T (*function)(A...) > 

我也會改變:

{ T operator()(A... arguments) { return function(arguments); } 

{ 
    template<typename...Ts> 
    T operator()(Ts&&... arguments) const { 
    return function(std::forward<Ts>(arguments)...); 
    } 

爲了提高效率。然後我再次不確定這一點。

相關問題