0

所以,我使用可变参数模板制作了一个简单的元组类......

我将如何制作一个有效的 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);
}

谢谢你的帮助!

4

2 回答 2

1

一种类型和零类型添加特化:

template <typename T>
class tuple
{
  T first_;

  // get() ...
}

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

于 2011-11-21T02:06:20.517 回答
0

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

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

然后用减少的 N 使其前向传递,当 N 为 0 时,专门返回元素。

于 2011-11-21T02:05:27.843 回答