2016-11-11 68 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 &&”? –

相关问题