2021SC@SDUSC
开源游戏引擎 Overload 代码模块分析 之 OvTools(五)—— Utils(中)
目录
前言
本篇是开源游戏引擎 Overload 模块 OvTools 的 Utils 小模块的中篇。简单回顾一下,上篇已经分析了 Utils 六个部分中的 PathParser 与 Random,它们分别是负责路径处理和随机数生成的类,具体可前往上篇文章查看。本篇咱们就继续探究接下来两个部分:ReferenceOrValue 与 SizeConverter。
另外,想先大致了解 Overload 可前往这篇文章,想看其他相关文章请前往笔者的 Overload 专栏自主选择。
分析
1、ReferenceOrValue
1.1 ReferenceOrValue 类
1.1.1 头文件
#include <variant>
该头文件来自 C++ 标准库,实现的功能主要是对变量对象的值的保存和管理。文件中的核心概念就是 variant 类型,其中文翻译可以是变体。
具体来说,variant 数据类型是所有没被显式声明(用如 Dim、Private、Public 或 Static等语句)为其他类型变量的数据类型,它没有类型声明字符。除了定长 String 数据及用户定义类型外,variant 可以包含任何种类的数据,包括 Empty、Error、Nothing 及 Null 等特殊值。所以,variant 类型的变量所包含的值类型必须是赋予了 variant 模板参数的类型之一,我们把这些模板参数称为替代项。
此外,文件还含有多种例如运算符重载等处理变量对象值的函数,可以用 VarType 函数或 TypeName 函数来决定如何处理 variant 中的数据。
1.1.2 主体代码
主体代码是一个 ReferenceOrValue 类,其作用是简化一个变量类型的定义,这样就不用在意这个变量是引用还是实值等等了。由于该类的操作都比较简洁,所以没有另设 cpp 文件,函数实现代码及其注释都已经在 h 文件,让我们来直接看看代码吧:
template <typename T>
class ReferenceOrValue
{
public:
/**
* Construct the ReferenceOrValue instance with a reference
* @param p_reference
*/
ReferenceOrValue(std::reference_wrapper<T> p_reference) : m_data{
&p_reference.get() }
{
}
/**
* Construct the ReferenceOrValue instance with a value
* @param p_value
*/
ReferenceOrValue(T p_value = T()) : m_data{
p_value }
{
}
/**
* Make the ReferenceOrValue a reference
* @param p_reference
*/
void MakeReference(T& p_reference)
{
m_data = &p_reference;
}
/**
* Make the ReferenceOrValue a value
* @param p_value
*/
void MakeValue(T p_value = T())
{
m_data = p_value;
}
/**
* Implicit conversion of a ReferenceOrValue to a T
*/
operator T&()
{