2014-04-29 1 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

True, 그러나 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)...); 
    } 

효율성을 위해서. 그렇다면 다시 나는이 점에 대해 확신 할 수 없다.

관련 문제