gpt4 book ai didi

c++ - 类模板如何存储引用或值?

转载 作者:IT老高 更新时间:2023-10-28 22:19:51 25 4
gpt4 key购买 nike

阅读 universal references让我想知道:我怎样才能构造一个类模板,以便它在可能的情况下通过引用存储,或者在必须的情况下通过值存储?

也就是说,我可以这样做吗

template <class T>
class holder {
T obj_m; // should be a reference if possible...
public:
holder(T t) :obj_m { t } {}
}

auto
hold_this(T && t) { return holder<T>(t); }

除了当 hold_this() 被赋予一个 lvalue 时,持有者将持有一个引用,而当给定 rvalue 时,持有者将作出拷贝?

最佳答案

Except that when hold_this() is given an lvalue the holder will hold a reference, and when given an rvalue the holder will make a copy?

你已经写好了(减去所需的 template <typename T> )。 转发引用保留值类别的扣除规则如下:

  1. 如果 t绑定(bind)到 T2 类型的左值,然后 T = T2& .
  2. 如果 t绑定(bind)到 T2 类型的右值,然后 T = T2 .

std::forward 正是这些扣除规则依靠做它的工作。以及为什么我们还需要将类型传递给它。

上面的意思是你实例化了holder直接与 T2在右值情况下。给你你想要的。已制作拷贝。

事实上,制作了两份拷贝。一次创建构造函数参数t ,另一个拷贝是初始化obj_m从中。但是我们可以通过巧妙地使用 type_traits 来摆脱它:

template <class T>
class holder {
T obj_m; // should be a reference if possible...
public:
holder(std::add_rvalue_reference_t<T> t) :obj_m { std::forward<T>(t) } {}
};

template<typename T>
auto hold_this(T && t) { return holder<T>(std::forward<T>(t)); }

See it live .我们使用 add_rvalue_reference_t 制作 t在每种情况下都是正确的引用类型。并“模拟”使 obj_m { std::forward<T>(t) } 的论点推导解决初始化obj_m来自正确的引用类型。

我说“模拟”是因为理解 holder 的构造函数参数很重要。不能是转发引用,因为构造函数本身没有模板化。


顺便说一句,既然你标记了 ,我们还可以为您的示例添加演绎指南。如果我们将其定义如下(并入 feedback from T.C.):

template <class T>
class holder {
T obj_m; // should be a reference if possible...
public:
holder(T&& t) :obj_m { std::forward<T>(t) } {}
};

template<typename T>
holder(T&&) -> holder<T>;

然后 this live example表明您可以将变量定义为 hold h1{t};hold h2{test()}; , 与之前的函数返回值具有相同的推导类型。

关于c++ - 类模板如何存储引用或值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48862454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com