所以,我使用可变参数模板创建了一个简单的元组类...
我将如何制作一个有效的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);
}
感谢您的帮助!
答案 0 :(得分:1)
为一个类型以及零类型添加专门化:
template <typename T>
class tuple
{
T first_;
// get() ...
}
请注意,您的设计效率非常低。首先,get
索引应该是一个编译时常量参数,所以你需要get<i>
(就像std::tuple
那样)。您的运行时代码不包含错误检查,并且无法在编译时捕获无效调用。其次,所有构造函数都执行大量副本,这些副本可能应该被修改以允许完美转发。
答案 1 :(得分:0)
要使当前代码正常工作,请在空元组中创建一个get函数,不返回任何内容 或者,一个更好的解决方案是使用您喜欢的参数数量的参数来获取:
template<typename U, int N>
U get()
然后以减少的N向前传递,当N为0时,将其专门化以返回元素。