c++ - 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>
中得到一个元组,其中将值作为头部传递,将现有元组作为尾部传递?
解决方案
读了那个例子,我摸不着头脑,于是去寻找这本书。这本书并没有充满难以理解的例子,但它们被分散并逐步实施。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 似乎在他们的回答中得出了这个结论,但我认为这种情况对任何偶然发现这个问题并像我一样感到困惑的人都有帮助。
推荐阅读
- c - cs50 pset2 caesar,出现分段错误或不兼容的转换
- html - 打开 Graph 共享调试器抓取空的 html
- javascript - Javascript 的 Shift right with zero-fill operator (>>>) 产生意想不到的结果
- c - c中的原子拷贝
- download - 如何下载 PyPy?
- javascript - 如何获取按钮的值并将其作为 Flask 中另一个页面的标题?
- node.js - 如何通过使用 Windows 命令或 Node.js/Electron 搜索 USB 名称来获取驱动器号?
- aws-lambda - 为什么我的 Lambda 函数连接到 SES VPC Endpoint 会超时?
- react-native - 将项目推送到一个 constant.js 到 reactnative 并从不同的文件中提取
- javascript - 到达某个 X 位置后停止移动背景图像