成员变量的类型应该取决于构造函数参数的类型

时间:2016-11-11 10:28:15

标签: c++ rvalue-reference lvalue type-deduction

我尝试按如下方式定义类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 1}}是一个l值。

有谁知道如何实施?

1 个答案:

答案 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。< / p>

您的A模板应该如下所示:

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

  private:
    T _elem;
};

如果您只想从工厂方法允许构造,可以让make_a成为朋友并使构造函数成为私有。