【问题标题】:C++:Adding an element to a tupleC ++:将元素添加到元组
【发布时间】:2020-11-21 15:30:01
【问题描述】:

我正在研究 tuples 的自定义实现,这在 C++ 模板第二版中有描述。 我需要帮助来了解pushFront 的实际工作原理。为了将新元素放在元组的开头,编译器执行了哪些步骤

template <typename... Elements>
class Typelist
{
};

template <typename... Elements, typename NewElement>
class PushFrontT<Typelist<Elements...>, NewElement> {
 public:
  using Type = Typelist<NewElement, Elements...>;
};

template <typename List, typename NewElement>
using PushFront = typename PushFrontT<List, NewElement>::Type;

template <typename... Types, typename V>
PushFront<Tuple<Types...>, V> 
pushFront(Tuple<Types...> const& tuple, V const& value)
{
  return PushFront<Tuple<Types...>, V>(value, tuple);
}

在上面的代码中,最后一行实际上是如何工作的? "PushFront&lt;Tuple&lt;Types...&gt;, V&gt;(value, tuple);"

如何从PushFront&lt;Tuple&lt;Types...&gt;, V&gt; 得到一个元组,其中将值作为头部传递,将现有元组作为尾部传递?

【问题讨论】:

  • 这似乎是一本有点奇怪的书。这里的问题是PushFront 出于某种原因是一个。所以PushFront&lt;Tuple&lt;Types...&gt;, V&gt;(value, tuple); 实际上是PushFront 类的构造函数,它没有显示,但大概初始化了所有值。
  • 更明确地说,当我们展开别名时,我们看到PushFront&lt;Tuple&lt;Types...&gt;, V&gt;Typelist&lt;V, Types...&gt; 的另一种说法,所以调用PushFront 构造函数实际上是调用Typelist 构造函数我们没有看到。
  • 这里的类型发生了什么是相当简单的。不清楚的是某处需要解压tuple 参数,以便重新组装新元组。显示的代码中似乎没有任何内容。
  • @SamVarshavchik,这是我的问题 tuple 参数是如何解包的
  • 这是一个很好的问题。显示的代码中没有任何内容可以做到这一点。也许还有其他东西,在你没有在这里显示的任何代码中,这是同一个例子的一部分;但没有人能解释未显示的代码。

标签: c++ tuples c++17 typelist


【解决方案1】:

我在阅读该示例时挠了挠头,以至于我去寻找the book。这本书不是充满了难以理解的示例,但它们被分散并逐步实施。 OP的问题中只显示了几个。

涉及的第一部分是展示如何使用部分特化将类型推送到名为 Typelist 的可变参数实用程序结构:

template <typename... Elements>
class Typelist {};

template<typename List, typename NewElement>
class PushFrontT;

template<typename... Elements, typename NewElement>
class PushFrontT<Typelist<Elements...>, NewElement> { ... };

本书后面实现了一个完整的 Tuple 类,其中包含此构造函数:

Tuple(Head const& head, Tuple<Tail...> const& tail)

并为Tuple 添加一个PushFrontT 特化:

template<typename... Types, typename Element>
class PushFrontT<Tuple<Types...>, Element> { ... };

所以...答案是Tuple 有一个方便的构造函数来复制一个元组并在前面添加一个元素,以及一个使用partial template specialization 解包元组的类型列表并添加一个实用程序类键入到前面。 OP 似乎在他们的回答中得出了这个结论,但我认为这种背景对任何偶然发现这个问题并像我一样感到困惑的人都有帮助。

【讨论】:

    【解决方案2】:

    实际上需要部分模板特化

    // add element to the front:
    template<typename... Types, typename Element>
    class PushFrontT<Tuple<Types...>, Element> {
     public:
      using Type = Tuple<Element, Types...>;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多