【发布时间】:2014-10-28 14:29:23
【问题描述】:
我想编写一些将Object 作为参数之一的函数,无论是左值还是右值引用都无关紧要——但绝对不是值,而且绝对只有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
}
但第一个选项涉及编写两倍于我需要的函数,而第二个选项涉及编写一堆模板内容,这对我来说似乎有点过头了(我读到接受 anything 对于o - 哦,开个玩笑,真的只是Object)。
有没有更好的方法来解决这个问题,或者我只是坚持使用我觉得不那么无聊的任何一个?
【问题讨论】:
-
void foo(Object const& o)就够了吗?它将接受右值和左值,但它是const。 -
@Niall 哇。它完全会。有时,我显然是想太多了。
-
std::remove_const_t<std::remove_reference_t<T>>将是比std::decay_t<T>更好的选择,因为decay_t具有执行函数到指针和数组到指针转换的副作用。
标签: c++ c++11 rvalue-reference