2014-10-03 2 views
2

전달되는 메서드를 호출하고 값을 반환하는 함수가 들어있는 Foo라는 구조체가 있습니다. 잘 fooFunc전달 멤버 또는 비 멤버 함수 포인터를 매개 변수로 사용

Foo foo1; 
foo1.fooFunc(10, &barFunc); 

에 전달하지만 나는 또한 fooFunc이 멤버 함수를 허용 할 수 있습니다

내가 barFunc라는 방법을
struct Foo 
{ 
    unsigned char fooFunc(unsigned char param, unsigned char(getValueMethod)(const unsigned char)) 
    { 
     return getValueMethod(param); 
    } 
}; 

...

static unsigned char barFunc(const unsigned char paramA) 
{ 
    return paramA * 2; 
} 

..., bazFunc와 같은 ...

struct Baz 
{ 
    unsigned char bazFunc(const unsigned char paramB) 
    { 
     return paramB * 3; 
    } 
}; 

... 이런 식으로 호출 할 ...

Foo foo2; 
Baz baz; 
foo2.fooFunc(10, ?????); 

...하지만 유효하지 않습니다.

매개 변수로 멤버 함수를 전달할 때 발견 한 모든 사항은 객체가 호출되기 전에 어떤 클래스가 생성되는지 알기 때문에 하나가 아닌 2 개의 함수를 만들어야한다는 것을 의미합니다.

하나의 fooFunc 메서드 만 필요하지만 비 멤버 및 멤버 함수를 지원하는 방법은 아직 없습니다.

+0

C++ 11을 사용할 수 있습니까? –

+1

아니, 할 수 없어 ..... – Beakie

+0

당신은'boost :: bind' ('this' 포인터를 묶기 위해)와 템플릿 호출 가능을 원합니다. 기술적으로 두 개 이상의'fooFunc '--- method --- 멤버 함수가 있지만'fooFunc' 멤버 함수 템플릿은 하나뿐입니다! –

답변

1

후 C++ 11

사전 ++ (11) C :

#include <iostream> 
#include <functional> 


using namespace std; 

struct foo_holder { 

    template<class T> 
    unsigned char foo(unsigned char v, T f) { 
     return f(v); 
    } 

}; 

unsigned char bar(unsigned char param) { 
    return param * 2; 
} 

struct baz { 
    unsigned char bar(unsigned char param) { 
     return param * 3; 
    } 
}; 

int main() 
{ 
    cout << "Hello World" << endl; 

    foo_holder f; 
    baz b; 

    cout << static_cast<int>(
    f.foo(6, bar) 
    ) << endl; 

    cout << static_cast<int>(
    f.foo(6, std::bind1st(std::mem_fun(&baz::bar), &b)) 
    ) << endl; 

    return 0; 
} 
+0

제 코드가 C++ 11이 아니므로 boost를 구현하고 싶지 않습니다. (템플릿을 사용해도 2 개의 함수를 생성하고 싶지는 않지만) 대답으로 생각합니다. 내 실제 구현을위한 최상의 작업 솔루션입니다. – Beakie

+0

'foo_holder :: foo'의 정의는 오직 하나뿐입니다 - 당신의'Foo :: fooFunc'와 같습니다. 템플릿 멤버 함수 일뿐입니다. –

+0

하지만 2 개의 호출 (하나는 멤버 함수를 사용하고 다른 하나는 비 멤버 함수를 사용)로 구현하면 2 (컴파일 된) 함수를 얻게 될 것입니다. 맞습니까? – Beakie

3

가지고 boost::function<signature>는 C++ (11) 또는 작업이 용이 부스트 boost::bind()

bool free_func(std::string const& arg) { ... } 

struct X { 
    bool mem_func(std::string const& arg) { ... } 
}; 

... 
typedef boost::function<bool (std::string const& name)> func_t; 

std::vector<func_t> funcs; 
X x; 

funcs.push_back(boost::bind(&X::mem_func, x, _1)); 
funcs.push_back(boost::bind(&free_func, _1)); 
1

의 결과를 전달합니다 -하지만 당신은 C++ 03 솔루션을 원하기 때문에, 다음 의견 제안 - 사용 템플릿 멤버 함수 :

Foo foo1; 
foo1.fooFunc(10, &barFunc); 
0,123,516 :
struct Foo 
{ 
    template <typename Function> 
    unsigned char fooFunc(unsigned char param, Function getValueMethod) 
    { 
     return getValueMethod(param); 
    } 
}; 

그런 다음 무료 기능 예제 당신은 아무것도 변경되지 않습니다

멤버 함수와

- 단지 C++ 03 <functional>에서 C++ 03 std::mem_fun/bind1st 사용 : 다른 답변에 따라,

#include <functional> 
Foo foo2; 
Baz baz; 
foo2.fooFunc(10, std::bind1st(std::mem_fun(&Baz::bazFunc), &baz)); 
관련 문제