Giả sử tôi có hai struct
s:Perfect chuyển tiếp thành viên của đối tượng
struct X {};
struct Y { X x; }
tôi có chức năng:
void f(X&);
void f(X&&);
Làm thế nào để viết một hàm g()
rằng mất Y&
hoặc Y&&
nhưng hoàn hảo chuyển tiếp X&
hoặc X&&
đến f()
, tương ứng:
template <typename T>
void g(T&& t) {
if (is_lvalue_reference<T>::value) {
f(t.x);
} else {
f(move(t.x));
}
}
Mã trên minh họa ý định của tôi nhưng không thể mở rộng được vì số lượng tham số tăng lên. Có cách nào làm cho nó hoạt động để chuyển tiếp hoàn hảo và làm cho nó có khả năng mở rộng?
Tôi nghĩ rằng thay đổi 'is_lvalue_reference :: giá trị' cho 'is_lvalue_reference (t))> :: giá trị' sẽ có ngữ nghĩa mà bạn muốn, nhưng tôi nghĩ ngữ nghĩa mong muốn của bạn là có vấn đề ... –
ildjarn
(Xin lỗi vì câu trả lời bị hỏng). Tôi muốn nói lý do không quy mô là vì thiết kế là có vấn đề để bắt đầu. "Di chuyển" một subobject nghĩa là gì? Trong trạng thái nào điều này rời khỏi đối tượng chính? Ngay cả khi có một cách dễ dàng để viết điều này, nó trông giống như mã có cấu trúc kém ... –