2010-03-19 4 views
2

두 개의 인수를 사용하여 문자열을 반환하는 함수 포인터가 필요합니다.인수를 바인드하는 functor를 만드는 방법이 무엇입니까

하나의 인수를 사용하는 함수를 래핑하고 해당 문자열을 반환하는 어댑터를 전달하고 싶습니다 (즉 인수 중 하나를 버립니다).

나는 2 개의 인수를 취하고, 하나의 인수 만 전달하는 랩핑 된 함수를 호출하는 자체 어댑터를 간단히 빌드 할 수 있습니다.

그러나 나는 C++/boost에서 그렇게 쉬운 방법이 있다면 훨씬 더 간단한 방법으로 어댑터를 만들 수 있을까요?

여기이 좀 더 구체적인하기 위해 몇 가지 세부 사항을이다 :

typedef boost::function<CString (int,int)> TooltipTextFn; 

class MyCtrl 
{ 
public: 
    MyCtrl(TooltipTextFn callback = boost::bind(&MyCtrl::GetCellText, this, _1, _2)) : m_callback(callback) { } 

    // QUESTION: how to trivially wrapper GetRowText to conform to TooltipTextFn by just discarding _2 ?! 
    void UseRowText() { m_callback = boost::bind(&MyCtrl::GetRowText, this, _1, ??); } 

private: 

    CString GetCellText(int row, int column); 
    CString GetRowText(int row); 

    TooltipTextFn m_callback; 
} 

을 분명히, 나는 두 개의 인수를 취할 GetRowText 적응 멤버를 공급하는 유일한 자체) (GetRowText에 처음 통과 할 수 있습니다.

하지만 이미 내가 할 수있는 부스트 바인더/어댑터가 있습니까?

답변

4

만을 제공하면 m_callback에 주어진 두 번째 매개 변수를 무시하고 을 int 매개 변수로 호출합니다. 우리가 MyCtrl::GetRowText의 첫번째 매개 변수로 m_callback에 전달 된 2 매개 변수를 보낼 곳 반면에

void UseRowText() { m_callback = boost::bind(&MyCtrl::GetRowText, this, _1); } 

,

void UseRowText() { m_callback = boost::bind(&MyCtrl::GetRowText, this, _2); } 

도 유효합니다.

+0

VS2008 SP 1은이 코드에서 불평합니다. 나는 boost :: bind가 (적어도 첫 번째 예제에서 필자가 필요로하는) ​​1 개의 인수를 취하는 functor를 생성하고 있다고 생각합니다. 바인드가 하나의 인수 만 사용하는 동안 TooltipTextFn과 일치하는 함수 서명을 생성하도록 강제하는 방법이 있다면 ... – Mordachai

+0

나는이 문제에 부딪치지 않는 것 같습니다. 나는 g ++에서 일하고 있으며 VS에 즉시 액세스 할 수있는 권한이 없습니다. 다른 제안으로, 생성자의 기본 매개 변수에있는'this' 포인터입니까? – tJener

+0

당신 말이 맞아요. 문제는 삼항 조건부가 X를 컴파일하지 않는다는 것입니다. Y : Z. 그러나 내가 명시 적으로 X = Y; 그러면 상황은 좋았습니다. 감사. :) – Mordachai

관련 문제