반응형
std :: function 작동 방식
알다시피 람다 함수를 다음과 std::function
같이 래핑하거나 저장할 수 있습니다 .
#include <iostream>
#include <functional>
int main()
{
std::function<float (float, float)> add = [](float a, float b)
// ^^^^^^^^^^^^^^^^^^^^
{
return a + b;
};
std::cout << add(1, 2) << std::endl;
}
내 질문은 std::function
템플릿 클래스이지만 모든 종류의 함수 서명을 받아 들일 수 있다는 것을 알 수 있듯이 주위 에 있습니다 .
예를 float (float, float)
들어이 형식으로 return_value (first_arg, second_arg)
.
의 구조는 무엇 std::function
이며 어떻게 기능 서명을 받아들이고 x(y,z)
어떻게 작동합니까? 가 float (float, float)
C ++의 새로운 유효한 표현은?
그것은 몇 가지 사용 유형 삭제 기술을 .
한 가지 가능성은 템플릿과 혼합 하위 유형 다형성을 사용하는 것입니다. 다음은 전체 구조에 대한 느낌을주기 위해 단순화 된 버전입니다.
template <typename T>
struct function;
template <typename Result, typename... Args>
struct function<Result(Args...)> {
private:
// this is the bit that will erase the actual type
struct concept {
virtual Result operator()(Args...) const = 0;
};
// this template provides us derived classes from `concept`
// that can store and invoke op() for any type
template <typename T>
struct model : concept {
template <typename U>
model(U&& u) : t(std::forward<U>(u)) {}
Result operator()(Args... a) const override {
t(std::forward<Args>(a)...);
}
T t;
};
// this is the actual storage
// note how the `model<?>` type is not used here
std::unique_ptr<concept> fn;
public:
// construct a `model<T>`, but store it as a pointer to `concept`
// this is where the erasure "happens"
template <typename T,
typename=typename std::enable_if<
std::is_convertible<
decltype( t(std::declval<Args>()...) ),
Result
>::value
>::type>
function(T&& t)
: fn(new model<typename std::decay<T>::type>(std::forward<T>(t))) {}
// do the virtual call
Result operator()(Args... args) const {
return (*fn)(std::forward<Args>(args)...);
}
};
(Note that I overlooked several things for the sake of simplicity: it cannot be copied, and maybe other problems; don't use this code in real code)
참고URL : https://stackoverflow.com/questions/14936539/how-stdfunction-works
반응형
'IT박스' 카테고리의 다른 글
실행중인 Oracle 클라이언트 버전을 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.18 |
---|---|
boost :: variant와 boost :: any는 어떻게 작동합니까? (0) | 2020.11.18 |
D3.js에서 속성을 제거하는 방법은 무엇입니까? (0) | 2020.11.18 |
잡히지 않은 ReferenceError : 함수가 onclick으로 정의되지 않았습니다. (0) | 2020.11.18 |
부트 스트랩 3 탐색 모음의 축소에서 메뉴 항목 제외 (0) | 2020.11.18 |