【发布时间】:2012-01-24 03:12:28
【问题描述】:
假设我有两个structs:
struct X {};
struct Y { X x; }
我有函数:
void f(X&);
void f(X&&);
如何编写一个函数g(),它接受Y& 或Y&&,但完美地将X& 或X&& 分别转发到f():
template <typename T>
void g(T&& t) {
if (is_lvalue_reference<T>::value) {
f(t.x);
} else {
f(move(t.x));
}
}
上面的代码说明了我的意图,但随着参数数量的增加,它的可扩展性并不高。有没有办法让它完美转发并使其可扩展?
【问题讨论】:
-
我认为将
is_lvalue_reference<T>::value更改为is_lvalue_reference<decltype(std::forward<T>(t))>::value将具有您想要的语义,但我认为您想要的语义是有问题的...... -
(抱歉回答拙劣。)我想说它无法扩展的原因是因为设计一开始就有问题。 “移动”子对象是什么意思?这使主要对象处于什么状态?即使有一种简单的方法来编写它,它看起来也像是结构不佳的代码......
标签: c++ c++11 rvalue-reference perfect-forwarding