2011-11-21 97 views
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); 
} 

感谢您的帮助!

+0

如果这不是作业:你是否从''签出'std :: tuple'? –

+3

只有所有类型都是相同的,你的'get'函数才会起作用,这不是元组背后的意图。 – Xeo

回答

0

为了让您的当前代码正常工作,请在空元组中使用get函数返回任何内容。
另外,较好地解决它来获得与参数的数量的参数你喜欢:

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

,然后使其与简化的N传球推进,当n为0时,专门就返回元件。

1

添加一个专业化的一个类型以及零种类型:

template <typename T> 
class tuple 
{ 
    T first_; 

    // get() ... 
} 

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