// Copyright 2010, Shuo Chen. All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)
#ifndef MUDUO_BASE_WEAKCALLBACK_H
#define MUDUO_BASE_WEAKCALLBACK_H
#include <functional>
#include <memory>
namespace muduo
{
// A barely usable WeakCallback
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename CLASS, typename... ARGS>
class WeakCallback
{
public:
WeakCallback(const std::weak_ptr<CLASS>& object,
const std::function<void (CLASS*, ARGS...)>& function)
: object_(object), function_(function)
{
}
// Default dtor, copy ctor and assignment are okay
void operator()(ARGS&&... args) const
{
std::shared_ptr<CLASS> ptr(object_.lock());
if (ptr)
{
function_(ptr.get(), std::forward<ARGS>(args)...);
}
// else
// {
// LOG_TRACE << "expired";
// }
}
private:
std::weak_ptr<CLASS> object_;
std::function<void (CLASS*, ARGS...)> function_;
};
template<typename CLASS, typename... ARGS>
WeakCallback<CLASS, ARGS...> makeWeakCallback(const std::shared_ptr<CLASS>& object,
void (CLASS::*function)(ARGS...))
{
return WeakCallback<CLASS, ARGS...>(object, function);
}
template<typename CLASS, typename... ARGS>
WeakCallback<CLASS, ARGS...> makeWeakCallback(const std::shared_ptr<CLASS>& object,
void (CLASS::*function)(ARGS...) const)
{
return WeakCallback<CLASS, ARGS...>(object, function);
}
#else // __GXX_EXPERIMENTAL_CXX0X__
// the C++98/03 version doesn't support arguments.
template<typename CLASS>
class WeakCallback//用于保存一个类的函数和这个类的一个对象(智能指针)
{
public:
WeakCallback(const std::weak_ptr<CLASS>& object,//参数就是智能指针。
const std::function<void (CLASS*)>& function)//这是成员函数的仿函数,默认保存一个class对象
: object_(object), function_(function)
{
}
// Default dtor, copy ctor and assignment are okay
void operator()() const
{
std::shared_ptr<CLASS> ptr(object_.lock());//提升到shared_ptr
if (ptr)
{
function_(ptr.get());//执行object_->function_()
}
// else
// {
// LOG_TRACE << "expired";
// }
}
private:
std::weak_ptr<CLASS> object_;
std::function<void (CLASS*)> function_;
};
template<typename CLASS>
WeakCallback<CLASS> makeWeakCallback(const std::shared_ptr<CLASS>& object,
void (CLASS::*function)())
{
return WeakCallback<CLASS>(object, function);
}
template<typename CLASS>
WeakCallback<CLASS> makeWeakCallback(const std::shared_ptr<CLASS>& object,
void (CLASS::*function)() const)//const成员函数,注意它的写法,是class::*funcname
{
return WeakCallback<CLASS>(object, function);
}
#endif // __GXX_EXPERIMENTAL_CXX0X__
}
#endif
muduo库源码学习(base):WeakCallback
最新推荐文章于 2024-05-12 14:00:49 发布