首页 > 解决方案 > C++:向元组添加元素

问题描述

我正在经历 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<Tuple<Types...>, V>(value, tuple);"

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

标签: c++tuplesc++17typelist

解决方案


读了那个例子,我摸不着头脑,于是去寻找这本书。这本书并没有充满难以理解的例子,但它们被分散并逐步实施。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)

并添加了PushFrontT专门针对Tuple

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

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


推荐阅读