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

Type of member variable should depend on constructor argument's type

我尝试定义一个 class 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 是右值或类型 T& 以防万一elem 是左值。

有人知道如何实现吗?

在我们得到 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。 =21=]

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

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

  private:
    T _elem;
};

如果您只想允许从工厂方法进行构造,您可以将 make_a 设为好友并将构造函数设为私有。