1
說我有下面的代碼:如何在非泛型類型上實現完美轉發?
class Element;
typedef shared_ptr<Element> ElementPtr;
class Element
{
public:
void add_child(const ElementPtr& elem);
private:
vector<ElementPtr> children;
}
inline void Element::add_child(const ElementPtr& elem)
{
children.push_back(elem);
};
我想更新add_child
使用完美轉發。我試圖改變函數的定義(和聲明),因此使用下面的邏輯:
void Element::add_child(ElementPtr&& elem)
{
children.push_back(forward<ElementPtr>(elem));
}
但這種崩潰對於任何在其中調用參數elem
是一個左值。所以我想我會試着用模板,並提出以下幾點:
template <ElementPtr elem>
void Element::add_child(ElementPtr&& elem)
{
children.push_back(forward<ElementPtr>(elem));
}
......但這不能編譯。所以我把它改爲:
template <class T>
void Element::add_child(T&& elem)
{
children.push_back(forward<T>(elem));
}
......哪些編譯和工作,但似乎醜陋和不正確; add_child
將只接受ElementPtr
類型的參數,所以它的函數聲明不應該反映這個嗎?
有沒有什麼辦法可以實現一個功能的完美轉發,同時在語法上證明它只接受一種變量?我基本上需要一個函數來自動區分特定參數類型的左值和右值版本。