std::function 및 리셋 클래스
#include 2. function 기반의 리셋 클래스는 대상 바늘과 구성원 함수 바늘을 리셋 유형의 구성원에 저장하고 어떤 실행 흐름에서 실행 구성원 함수 함수를 호출하면 함수의 리셋을 실현할 수 있다.상술한 사고방식에 근거하여muduo 라이브러리에서의 실현을 참고하여 리셋류에 대한 봉인은 다음과 같다.되돌아오는 함수의 되돌아오는 값은void입니다.
#include & ptr_obj, const callable& cb)
    : ptr_obj_(ptr_obj),
    cb_(cb)
    {
    }
    //  
    void operator()(Args&&... args) 
    {
        //  shared_ptr, 
        shared_ptr ptr_obj(ptr_obj_.lock());
        if(ptr_obj)
        {
            cb_(ptr_obj.get(), std::forward(args)...);
        }
    }
private: 
    weak_ptr ptr_obj_;
    callable cb_;
};
template<typename CLASS, typename... ARGS>
WeakCallback makeWeakCallback(const shared_ptr& object, void (CLASS::*mem_func)(ARGS...))
{
  return WeakCallback(object, mem_func);
}
//  
struct Foo
{
public:
    Foo(int num) : num_(num) {}
    void printAdd(int a)
    {
        std::cout << "==printAdd: " << (num_ + a) << std::endl;
    }
private:
    int num_;
};
int main()
{
    shared_ptr ptr_foo(new Foo(5));
    auto wcb = makeWeakCallback(ptr_foo, &Foo::printAdd);
    wcb(5);
    return 0;
}        상기 코드의 가장 주요한 기능은 첫 번째 리셋 대상과 대상 구성원 함수가 호출될 때의 귀속을 실현하는 것이다. c++ 자체가 매개 변수 귀속 기능을 지원하기 때문에 다음과 같은 실현 방식이 있다.
template <typename Clz, typename... Args>
using BindedWeakCallback = function<void(Args...)>;
template<typename CLASS, typename... ARGS>
BindedWeakCallback makeWeakCallbackWithBind(const shared_ptr& object,
                                              void (CLASS::*mem_func)(ARGS...))
{
    return bind(mem_func, object.get(), placeholders::_1);
}
int main()
{
    shared_ptr ptr_foo(new Foo(5));
    auto wcb = makeWeakCallbackWithBind(ptr_foo, &Foo::printAdd);
    wcb(5);
    return 0;
}   이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.