c++——委托

发布时间:2024-05-31 17:01

c++有委托吗? 没有!也完全没必要,根本就不需要。因为有更好的方式。编译器也不需要,对编译器来说也是一种浪费。所以这个实现还有必要吗? 有! 不然,怎么让你划水,混日子水文章呢。

C#中委托就是C++中的函数指针的一种。语法写起来又沙雕,又特么另类。当时我看到这个函数后面跟->指向,.* 这种东西时。。什么沙雕!!

auto fun(int a, char b)-> int; //表示返回int类型  

指定返回的类型 仅此而已。这种东西被人写出来。。。有用吗? 有用。 但,真不一定会用到。

下面是官方解释:

c++——委托_第1张图片

那么 委托中,会用到吗? 会。

这是一段开源委托:我不解释了,懂得可能一看就懂,不懂就慢慢懂。



#include 
#include 
#include 
#include 


template
class Delegate;

namespace DelegateImpl
{
template 
struct Invoker
{
	using ReturnType = std::vector;

	public:
		static ReturnType Invoke(Delegate &delegate, TArgs... params)
		{
			std::lock_guard lock(delegate.mMutex);
			ReturnType returnValues;

			for (const auto &functionPtr : delegate.mFunctionList)
			{
				returnValues.push_back((*functionPtr)(params...));
			}

			return returnValues;
		}
};

template 
struct Invoker
{
	using ReturnType = void;

	public:
		static void Invoke(Delegate &delegate, TArgs... params)
		{
			std::lock_guard lock(delegate.mMutex);

			for (const auto &functionPtr : delegate.mFunctionList)
			{
				(*functionPtr)(params...);
			}
		}
};
}

template
class Delegate
{
	using Invoker = DelegateImpl::Invoker;
	using functionType = std::function;

	friend Invoker;

	public:
		Delegate() {}
		~Delegate() {}

		Delegate(const Delegate&) = delete;
		const Delegate& operator =(const Delegate&) = delete;

		Delegate& Connect(const functionType &function)
		{
			std::lock_guard lock(this->mMutex);

			this->mFunctionList.push_back(std::make_shared(function));

			return *this;
		}

		Delegate& Remove(const functionType &function)
		{
			std::lock_guard lock(this->mMutex);

			this->mFunctionList.remove_if([&](std::shared_ptr &functionPtr)
			{
				return Hash(function) == Hash(*functionPtr);
			});

			return *this;
		}

		inline typename Invoker::ReturnType Invoke(TArgs... args)
		{
			return Invoker::Invoke(*this, args...);
		}

		Delegate& Clear()
		{
			std::lock_guard lock(this->mMutex);

			this->mFunctionList.clear();

			return *this;
		}

		inline Delegate& operator +=(const functionType &function)
		{
			return Connect(function);
		}

		inline Delegate& operator -=(const functionType &function)
		{
			return Remove(function);
		}

		inline typename Invoker::ReturnType operator ()(TArgs... args)
		{
			return Invoker::Invoke(*this, args...);
		} 

	private:
		std::mutex mMutex;
		std::list> mFunctionList;

		inline constexpr size_t Hash(const functionType &function) const
		{
			return function.target_type().hash_code();
		}
};

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号