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

abr*_*ert 13 c++ lvalue rvalue-reference 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.
};
Run Code Online (Sandbox Code Playgroud)

在这里,我希望_elem有一个类型T,以防构造函数的参数elem是一个r值或者T&case中的类型elem是一个l值.

有谁知道这是如何实现的?

Tar*_*ama 12

在我们获得类模板的模板参数推导之前,您需要使用辅助函数:

template <typename T>
auto make_a (T&& elem) {
    return A<T>{std::forward<T>(elem)};
}
Run Code Online (Sandbox Code Playgroud)

这使用转发引用来推断参数是左值还是右值,并A通过完美转发参数来构造.以int作为一个例子,如果一个左值通过,T将是int&,如果一个右值被传递,Tint.

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

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

  private:
    T _elem;
};
Run Code Online (Sandbox Code Playgroud)

make_a如果你只想从工厂方法允许构造,你可以结交朋友并使构造函数成为私有.