2011-10-18 3 views
1

C++로 일반 래퍼를 작성하려고합니다. 여기에 지금까지 작성한 것입니다 :일반 래퍼 C++

예를 들어, 사용하여 인스턴스화 할 수
//primary template 
template<typename T> 
class function 
{ 
}; 
//partially specialized template 

template<typename T, typename U, typename V> 
class wrapper<T(U,V)> 
{ 
private: 
    //typedef pointer to function 
    typedef T (*pfn)(U,V); 
    pfn f; 

public: 

    wrapper(pfn func):f(func) 
    { 
    }; 

    T operator()(U a, V b) 
    { 
    return f(a,b); 
    } 
}; 

:

wrapper<double(double, double)> someWrapper(&someFunction); 
방법 누군가의 측면에서 올바른 방향으로 날 지점 수 있는지 궁금

다음과 같은 방법으로 인스턴스화 할 수 있도록 래퍼 템플릿을 수정하십시오.

wrapper<double(double, double)> somewrapper(&someClass, &someClass::someFunction) 
wrapper<double(someClass*, double)> somewrapper(&someClass::someFunction) 

이 점에 대해 도움을 주셔서 감사합니다.

+5

'std :: function'의 문제점은 무엇입니까? –

+0

Boost에 이미 Boost.Function이 있습니다 : http://www.boost.org/doc/libs/1_47_0/doc/html/function.html – Dani

+0

http://loki-lib.sourceforge.net/ –

답변

2

대신 std::function을 사용하거나 컴파일러에 TR1이 아직없는 경우 Boost 구현을 사용하십시오. 이 같은

template<typename T, typename C, typename U, typename V> 
class wrapper<T (C::*)(U,V)> 
{ 
private: 
    //typedef pointer to member-function 
    typedef T (C::*pfn)(U,V); 
    pfn f; 

public: 

    wrapper(pfn func):f(func) 
    { 
    }; 

    T operator()(C c, U a, V b) 
    { 
    return (c.*f)(a,b); 
    } 
}; 

하고 인스턴스화 : 즉이 멤버 함수에 당신이 포인터를 찾고 있습니다 전문입니다 말했다

wrapper< double(someClass::*)(double, double) > somewrapper; 

당신이 준 첫 번째 인스턴스는 불가능 아니지만, 대규모을 필요로 클래스 타입을 생성자 인수에서 추론 할 수 없기 때문에이를 삭제하기위한 타입 소거가 필요합니다.

wrapper<double(double, double)> somewrapper(&someClass, &someClass::someFunction) 

멤버 함수에 대한 포인터로 인스턴스화하려는 경우에만 예제 코드를 수정하여 두 번째 코드를 약간 수정하면됩니다.

wrapper<double(someClass*, double)> somewrapper(&someClass::someFunction) 

단일 래퍼 정의가 호환 인수 무료 회원 기능을 모두 사용할 수 원하는 가정하면, 다시 작동하게하는 몇 가지 유형의 삭제가 필요합니다. Boost.Function의 구현은 실제로 virtual 호출을 피하기 위해 다른 기술을 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 클래스 유형이 템플릿 매개 변수로 전달 된 것과 비슷한 구현을 작성했지만, 말했듯이 지금은 이러한 모든 시나리오를 다루기 위해 단일 래퍼를 작성할 수 있는지보고자했습니다. 그렇게하는 것이 사소한 일은 아닌 것처럼 보입니다! 나는 타입 지우기를 들여다 볼 것이다. 나는 그것을 인식하지 못했다. – Omar

2

프로그래밍 및 학습 연습으로이 작업을 수행하는 경우에는 문제가 없지만 철저한 테스트를 거친 많은 대안이 있습니다. C++ 11을 사용하는 경우 std::function을 사용할 수 있습니다. 그렇지 않으면 boost::functionboost::bind이 있습니다.

이제 학습 과정이라고 가정하면 각 매개 변수 수와 반환 값에 대해 래퍼 버전을 만들어야합니다. 함수가 클래스 멤버 인 경우를 다루어야하며, Functor 클래스를 다룰 때 대입 할 수도 있습니다.

이것은 많은 작업이고, 많은 코너 케이스가 있으며, 이미 존재하는 것을 복제하는 데 충분합니다.

+0

답변 해 주셔서 감사합니다. 네, 아마도 운동 한 것처럼, 이것은 저를위한 학습 운동입니다. 따라서 이러한 구현을 살펴보고 어떻게 작동하는지 살펴 보겠습니다. – Omar