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