c++ - c ++模板类存储引用或具有相同模板参数的值
问题描述
我想设计一个可以存储值或引用的类,但在模板声明中具有相同的参数。我不知道如何编写模板类。谁能给我一些建议
tempalte <typename T>
class Holder {
// ......
Holder(T &value);
Holder(T value);
}
class CannotCopy {
CannotCopy(CannotCopy const&) = delete;
};
Holder<CannotCopy> holder1(CannotCopy())
CannotCopy cannot_copy;
Holder<CannotCopy> holder2(cannot_copy) // passed by reference
解决方案
因此,如果我对您的理解正确,您有时希望该类拥有您传递给它的元素的所有权(当在适当位置构造时),有时您希望将它用作对存储在其他地方的所有权的引用。
不幸的是,当我告诉你这是一个坏主意时,我是根据经验说话的。乍一看,这看起来是个好主意,但是,经过一些抽象层之后,您最终会得到无法推理所有权的代码。
一种方法是在参数的右值/左值上重载构造函数:
template <typename T>
class Holder {
public:
Holder(T &&value)
: m_ownership{std::make_unique<T>(std::move(value))},
m_value{*m_ownership} {}
Holder(T &value) : m_value{value} {}
private:
std::unique_ptr<T> m_ownership;
T &m_value;
};
如您所见,现在有一个构造函数采用 a T &&
,它允许您将右值传递给它并移动它。(假设移动构造函数可用,这通常是不可复制的情况)这将知道它需要所有权并将值存储为 unique_ptr,然后在 m_value 中传递 unique_ptr 内部值的引用。
如果您使用左值调用构造函数,它只是将其放入 m_value 而不使用 unique_ptr 作为所有权。
这样,您的班级就拥有该值的有条件所有权。如果你不喜欢 unique_ptr 占用空间,你可以(如果对齐允许它 -> 你可以强制)做一些位操作来编码,如果你有或没有所有权,并编写一堆自定义代码。
推荐阅读
- python - 您还需要将对象传递给 views.py 中的模板
- database - JDBC 调用中的参数无效:参数索引超出范围(使用 Ucanaccess)
- linux - 在 Bash 脚本中定义和调用多个项目
- common-lisp - 用于 case 宏的 Defparameter 和相等谓词
- node.js - Redis 在 nodejs 中太慢了?
- python - 尝试使用 python 制作文档扫描仪但无法获得所需的输出图像
- xcode - 将关联域添加到 Expo React-Native 应用程序
- cmake - 如何在 CMake 项目中包含 qwt?
- xamarin - xamarin.forms 使用选择器更新 Listview
- javafx - 如何在节点处于活动状态时停止隐藏节点?