제목이 좀 헷갈릴 수 있으니 좀 더 명확하게 설명하겠습니다.
다음과 같은 수업이 있습니다.
class foo
{
public:
foo(%Some function% *) { %Some function pointer% = %Some function%; }
%Some output% callFunction(%Some input%);
private:
%Some function pointer% bar;
}
가급적이면 %Some function pointer%
클래스 전체에서 사용하기 위해 주어진 함수를 저장할 수 있기를 원 하지만 이것은 필요하지 않습니다.
그래서 내 주요 질문은 : 어떻게 함수 매개 변수와 함께 모든 함수를 입력으로 callFunction
받을 수 있는 실제 를 만들 수 있습니까?
도움을 주시면 감사하겠습니다!
반환 및 매개 변수 유형이 무엇인지 어딘가에 알아야합니다. 클래스 또는 템플릿 매개 변수에서 수정되었습니다.
다음은 고정 클래스의 예입니다.
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
오버 헤드를 끌지 않기 때문에 다른 솔루션보다 빠릅니다 . 여기서 단점은 make_foo
이전 C ++ 17 을 사용해야한다는 것 입니다.
그런 다음 위의 솔루션을 다음과 같이 사용할 수 있습니다.
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
여전히 다른 유형의 인스턴스입니다. 공제를 통해 템플릿 매개 변수가 숨겨집니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다