IT박스

std :: function 작동 방식

itboxs 2020. 11. 18. 08:47
반응형

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

반응형