假設我有兩個struct
S:完美轉發對象的成員
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 :: value'到'is_lvalue_reference (T) )> :: value'將會有你想要的語義,但是我認爲你想要的語義是有問題的...... –
ildjarn
2011-12-20 04:08:10
(對不起,這個拙劣的答案)我會說它不縮放的原因是因爲設計是可疑的開始。 「移動」子對象意味着什麼?這在什麼狀態下離開主要目標?即使有一種簡單的方法來編寫它,它看起來像結構不良的代碼... – 2011-12-20 04:12:08