Delegate 类模板解释文档

概述

Delegate 类模板是一个单播委托类,它封装了 C++ 的可变参数模板和 std::function,用于存储和调用具有任意数量参数的方法,但仅支持返回值为 void 类型的方法。委托类可以看作是函数指针的一个更灵活的替代品,它允许存储和调用任何可调用的目标(如函数、lambda 表达式、函数对象等)。

头文件

1
2
#include <functional>
#include <stdexcept>
  • <functional>: 提供了 std::function,用于封装函数对象。
  • <stdexcept>: 提供了标准异常类,如 std::runtime_error

类定义

成员类型别名

1
using FunctionType = std::function<void(Args...)>;
  • FunctionType: 类型别名,用于表示可以接受任意数量参数并返回 void 的函数类型。

构造函数

1
2
3
Delegate(int hashCode);
Delegate();
Delegate(const FunctionType& func);
  • Delegate(int hashCode)`: 构造一个无效的委托,并设置一个哈希码。
  • Delegate(): 默认构造函数,构造一个无效的委托。
  • Delegate(const FunctionType& func): 使用给定的函数对象构造一个委托,并从函数对象中获取哈希码。

成员函数

IsValid()

1
bool IsValid() const;
  • 检查委托是否有效(即是否已绑定到一个函数)。

Invoke()

1
void Invoke(Args... args);
  • 调用委托绑定的函数,并传递任意数量的参数。如果委托无效,则抛出 std::runtime_error 异常。

operator==()

1
bool operator==(Delegate& other) const;
  • 比较两个委托是否相等,基于它们的哈希码。

operator=()

1
Delegate& operator=(const FunctionType& func);
  • 将委托绑定到新的函数对象,并更新哈希码。

operator!=()

1
bool operator!=(const Delegate& other) const;
  • 检查两个委托是否不相等。

GetHashCode()

1
int GetHashCode();
  • 返回委托的哈希码。

SetHashCode()

1
void SetHashCode(int hashCode);
  • 设置委托的哈希码。哈希码只能手动设置一次。

私有成员

1
2
3
FunctionType function;
int _hashCode = 0;
bool _isHandSetHashCode = false;
  • function: 存储委托绑定的函数对象。
  • _hashCode: 存储函数对象的哈希码,用于比较委托。
  • _isHandSetHashCode: 标记哈希码是否已被手动设置。

注意事项

  • 委托类仅支持返回值为 void 的函数。
  • 在调用 Invoke 方法之前,应先检查委托是否有效。
  • 哈希码用于比较委托,如果函数对象的参数类型可能发生转换,应手动设置哈希码以确保正确比较。