2016-11-11 112 views
13

我試圖定義一個類A如下:類型的成員變量應取決於構造函數參數的類型

template< typename T > 
class A 
{ 
    public: 
    A(T elem) 
     : _elem(elem) 
    {} 

    private: 
    TYPE _elem; // "TYPE" should be either "T" in case "elem" is an r-value or "T&" in case "elem" is an l-value. 
}; 

在這裏,我想_elem有兩種萬一類型T,構造函數的參數elem是r值或T&類型的情況下elem是l值。

有誰知道這是如何實現的?

+1

我不夠聰明,爲你寫出這個,但你使用模板* specialization *實現這一點。 Upvoted吸引注意力。 – Bathsheba

+0

我也有這個需要(編寫視圖類時)... –

回答

12

,直到我們得到template argument deduction for class templates,你需要使用這個輔助函數:

template <typename T> 
auto make_a (T&& elem) { 
    return A<T>{std::forward<T>(elem)}; 
} 

這將使用轉發引用來推斷該參數是一個左或右值和完美轉發構建A爭論。以int爲例,如果通過左值,則T將爲int&,如果通過右值,則T將爲int

A模板應該只是看起來像這樣:

template< typename T > 
class A 
{ 
    public: 
    A(T elem) 
     : _elem(elem) 
    {} 

    private: 
    T _elem; 
}; 

你可以做make_a的朋友,使構造私人,如果你只希望允許從工廠法施工。

+0

爲什麼std :: move在A的構造函數中使用? – themagicalyang

+0

@themagicalyang呃,習慣。 – TartanLlama

+0

當r值被傳遞時,T爲什麼是「int」而不是「int &&」? –

相關問題