반환 값과 매개 변수 유형을 알아야합니다. 클래스 또는 템플릿 매개 변수에서 고정되었습니다.
여기 클래스 고정의 예 :
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
은 여전히 다른 유형의 인스턴스입니다. 템플릿 매개 변수는 공제를 통해 숨겨집니다.
아마 이런 것이있을 것입니다 : http://stackoverflow.com/questions/17805969/writing-universal-memoization-function-in-c11 –
명확히하기 위해, 당신은 주어진 인수를 취하기 위해'foo :: callFunction'를 원합니다. '% Some input %'당신은'bar'를 호출하여'bar'가 반환 한 값을 반환하기를 원합니다. IOW, 일종의 passthrough/proxy 기능 같은가요? – greatwolf
@greatwolf 그래, 그게 내가 성취하려고하는 것이지만, 어떻게해야하는지 정확히 모르겠다. – 0x22fe