std::function 및 리셋 클래스
#include
#include
#include
int add(int a, int b)
{
return a + b;
}
class EchoMessage
{
public:
void echoMessage(const string& msg)
{
std::cout << msg << std::endl;
}
}
void test()
{
//
function<int(int, int)> f_add = &add;
int sum = f_add(1, 2);
// , ;
function<void(EchoMessage&, const string&)> f_echo = &EchoMessage::echoMessage;
EchoMessage em;
f_echo(em, "Hello");
//
function<void(const string&)> f_echo1 = bind(&EchoMessage::echoMessage, em, placeholders::_1);
f_echo1("Hello");
}
2. function 기반의 리셋 클래스는 대상 바늘과 구성원 함수 바늘을 리셋 유형의 구성원에 저장하고 어떤 실행 흐름에서 실행 구성원 함수 함수를 호출하면 함수의 리셋을 실현할 수 있다.상술한 사고방식에 근거하여muduo 라이브러리에서의 실현을 참고하여 리셋류에 대한 봉인은 다음과 같다.되돌아오는 함수의 되돌아오는 값은void입니다.
#include
#include
#include
using namespace std;
template <typename Cls, typename... Args>
class WeakCallback
{
public:
// , , function ;
using callable = function<void(Cls*, Args...)>;
// , , WeakCallback
WeakCallback(const weak_ptr& 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에 따라 라이센스가 부여됩니다.