如何从可变元组中获取元素

How do I get elements from a variadic tuple?

本文关键字:获取 元素 元组      更新时间:2023-10-16

因此,我使用可变模板创建了一个简单的元组类…

我该如何去做一个工作get方法/助手函数?我使用的当前元组导致编译器期望在空元组中定义get。

代码如下:

template<typename... T>
class tuple;
template< > 
class tuple< > { };
template<typename U, typename... T>
class tuple<U, T...>
{
public:
  tuple () {};
  tuple (U f, T... r);
  U get (int idx, int numCalls = 0) const;
  U first_;
  tuple<T...> rest_;
};
template<typename U, typename... T>
tuple<U, T...>::tuple (U f, T... r)
{
  first_ = f;
  rest_ = tuple<T...> (r...);
}
template<typename U, typename... T>
U tuple<U, T...>::get (int idx, int numCalls) const
{
  if (idx == numCalls)
    return first_;
  return rest_.get (idx, numCalls + 1);
}

谢谢你的帮助!

一个类型和零类型添加专门化:

template <typename T>
class tuple
{
  T first_;
  // get() ...
}

注意你的设计是非常低效的。首先,get索引实际上应该是一个编译时常量参数,所以您需要get<i>(就像std::tuple一样)。您的运行时代码不包含错误检查,并且在编译时无法捕获无效调用。其次,所有的构造函数都要执行大量的复制,这些复制可能需要修改以允许完美的转发。

要使当前代码正常工作,请在空元组中创建一个不返回任何值的get函数。
或者,一个更好的解决方案是使用您喜欢的参数数量的形参get:

template<typename U, int N>
U get()

,然后使其传递简化后的N,当N为0时,对其进行专门化以返回该元素。