2016-12-31 1 views
1

제목이 다소 혼란 스러울 수 있으므로 좀 더 명확하게 설명하겠습니다. 나는 수업 전반에 걸쳐 사용 할 %Some function pointer%에 주어진 함수를 저장할 수 있도록하고 싶습니다,다른 매개 변수가있는 함수를 함수 매개 변수로 사용하는 방법

class foo 
{ 
public: 

    foo(%Some function% *) { %Some function pointer% = %Some function%; } 

    %Some output% callFunction(%Some input%); 

private: 

    %Some function pointer% bar; 
} 

바람직하게,하지만이 필요하지 않습니다 :

내가 좋아하는 클래스를 가지고있다.

그래서 내 주요 질문은 : 어떻게 그 매개 변수를 기능과 함께 입력으로 어떤 기능에 걸릴 수있는 실제 callFunction을 만들 수 있을까?

도움을 주시면 감사하겠습니다.

+0

아마 이런 것이있을 것입니다 : http://stackoverflow.com/questions/17805969/writing-universal-memoization-function-in-c11 –

+0

명확히하기 위해, 당신은 주어진 인수를 취하기 위해'foo :: callFunction'를 원합니다. '% Some input %'당신은'bar'를 호출하여'bar'가 반환 한 값을 반환하기를 원합니다. IOW, 일종의 passthrough/proxy 기능 같은가요? – greatwolf

+0

@greatwolf 그래, 그게 내가 성취하려고하는 것이지만, 어떻게해야하는지 정확히 모르겠다. – 0x22fe

답변

1

반환 값과 매개 변수 유형을 알아야합니다. 클래스 또는 템플릿 매개 변수에서 고정되었습니다.

여기 클래스 고정의 예 :

struct foo { 
    foo(std::function<int(std::string, double)> func) : bar{std::move(func)} {} 

    int callFunction(std::string s, double d) { 
     bar(std::move(s), d); 
    } 

private: 
    std::function<int(std::string, double)> bar; 
}; 

이 방법은 함수 포인터를 허용 않을뿐 아니라 임의의 함수 형상 물체도 람다있다.

template<typename F> 
struct foo { 
    foo(F func) : bar{std::move(func)} {} 

    template<typename... Args> 
    auto callFunction(Args&&... args) -> decltype(bar(std::declval<Args>()...)) { 
     return bar(std::forward<Args>(args)...); 
    } 

private: 
    F bar; 
}; 

template<typename F> 
auto make_foo(F f) { 
    return foo<F>{std::move(f)}; 
} 

이 방법은 어떤 기능이나 기능을 할 수 있습니다 :

유형이 고정되도록 원하지 않는 경우에, 당신은 포장 함수 객체의 유형을 지정하는 템플릿을 사용하면 원하는 사용할 수 있습니다 와 같은 개체이며, 다른 솔루션보다 빠르기 때문에 std::function 오버 헤드가 발생하지 않습니다. 여기서 단점은 C++ 17 이전의 make_foo을 사용해야한다는 것입니다.

당신은 다음과 같이 위의 솔루션을 사용할 수 있습니다

auto f1 = make_foo([](int i){ return i * 1.5; }); 
auto f2 = make_foo([]{}); 

double result = f1.callFunction(12); 
f2.callFunction(); 

당신이 C++ (17)의 스위치를 플립 경우에, 당신은 쓸 수 있습니다 :

foo f1 = [](int i){ return i * 1.5; }; 
foo f2 = []{}; 

double result = f1.callFunction(12); 
f2.callFunction(); 

f1을 그와 f2은 여전히 ​​다른 유형의 인스턴스입니다. 템플릿 매개 변수는 공제를 통해 숨겨집니다.

+0

이것은 훌륭한 대답입니다! 여러분의 도움과 C++ 17 팁에 감사드립니다. – 0x22fe

관련 문제