【问题标题】:Type of member variable should depend on constructor argument's type成员变量的类型应该取决于构造函数参数的类型
【发布时间】:2017-03-25 13:36:22
【问题描述】:

我尝试如下定义一个类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&amp; 以防 elem 是左值。

有人知道如何实现吗?

【问题讨论】:

  • 我不够聪明,无法为你写出来,但你可以使用模板 specialisation 来实现。投赞成票以吸引注意力。
  • 我也需要这个(在编写视图类时)...

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


【解决方案1】:

在我们得到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&amp;,如果传的是右值,T就是int

您的A 模板应如下所示:

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

  private:
    T _elem;
};

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

【讨论】:

  • 为什么 std::move 在 A 的构造函数中使用?
  • 当一个r值被传递时,为什么是T然后int而不是int&amp;&amp;
  • @abraham_hilbert 这就是正常模板推导规则的工作方式。 int&amp; 推论是一个特例。
  • 我认为这个推论现在已经集成在标准 C++ 中,en.cppreference.com/w/cpp/language/… (CTAD)
猜你喜欢
  • 1970-01-01
  • 2019-05-25
  • 2015-05-16
  • 1970-01-01
  • 2017-09-14
  • 2021-05-13
  • 1970-01-01
  • 2021-10-11
  • 2011-06-28
相关资源
最近更新 更多