我想编写一些函数,其中一个参数是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
}
但第一种选项需要编写两倍于我需要的函数数量,而第二种选项则需要编写大量模板内容,这似乎对我来说有点过度设计(我可以将其理解为接受 任何 作为 o
- 哦,开玩笑了,真正只是一个 Object
)。
是否有更好的方法来解决这个问题,或者我只是在两种方案中选择较少烦恼的那个?
void foo(Object const& o)
足够了吗?它可以接受 r-value 和 l-value,但是是const
的。 - Niallstd::remove_const_t<std::remove_reference_t<T>>
比std::decay_t<T>
更好,因为decay_t
会产生函数指针和数组指针转换的副作用。 - Casey