gpt4 book ai didi

c++ - 接受左值引用或右值引用

转载 作者:太空狗 更新时间:2023-10-29 19:52:22 25 4
gpt4 key购买 nike

我想编写一些将 Object 作为参数之一的函数,无论是左值还是右值 ref 都没有关系 - 但绝对不是值而且绝对只是一个 Object 。看来我有两个选择:

void foo(Object& o) {
// stuff
}

void foo(Object&& o) { foo(o); } // this is fine for my use-case

或者使用通用引用:

template <typename T, typename U>
using decays_to = typename std::is_same<std::decay_t<T>, U>::type;

template <typename T>
std::enable_if_t<decays_to<T, Object>::value>
foo(T&& o)
{
// same stuff as before
}

但第一个选项涉及编写两倍于我需要的函数,而第二个选项涉及编写一堆模板内容,这对我来说似乎有点过分(我有点认为接受任何 for o - 开个玩笑,真的只是一个 Object)。

有没有更好的方法来解决这个问题,还是我只是坚持使用其中我感觉不太舒服的任何一个?

最佳答案

您的两个实现之间存在差异。第一个将接受任何可转换为 ObjectObject&&Object& 的内容。第二个将只接受 Object 以及以右值或左值形式从它继承的东西(并拒绝 const Object,就像第一个一样)。

我们可以添加一个辅助对象:

template<class T>
struct l_or_r_value {
T& t;
l_or_r_value( T&& t_ ):t(t_) {}
l_or_r_value( T& t_ ):t(t_) {}
operator T&(){ return t; }
T* operator->(){ return &t; }
T& operator*(){ return t; }
T& get(){ return t; }
};

然后我们可以写:

void foo(l_or_r_value<Object> o)

我们得到的行为非常接近您的第二个解决方案,在调用点没有模板 mumbo jumbo。您必须访问 *oo-> 或执行 Object& o = o_; 才能获取原始引用。

它不像第一个解决方案,因为 C++ 不会链接两个用户定义的转换。

概念提案将增加这样的功能,即“我可以在这里接受任何东西,只要它是一个 Object”,语法更简洁。

另一种方法是只获取Object&,然后使用:

tepmlate<class T>
T& lvalue( T&& t) { return t; }

在需要时将右值转换为左值(也可以将其称为unmove 以示可爱)

关于c++ - 接受左值引用或右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26610906/

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