2016-05-09 38 views
2

我在为了好玩而在C++中实现元组,并且陷入了困境,因为下面的类修改了它,以便我可以通过使用模板轻松地通过仅使用索引来提取每个元素。类似于std :: get。我将如何实现一个函数来提取这个类的元素?

TL; DR:如何提取元组内的元素的实现看起来像?

template<typename first_t, typename ... arg_v> 
class Tuple : public Tuple<arg_v ...> 
{ 
public: 

    Tuple() 
    { 
    } 

    Tuple(const first_t&& A) : 
     element(A) 
    { 
    } 

    Tuple(const first_t& A, arg_v& ... args) : 
     element(A), Tuple<arg_v ...>::Tuple(args ...) 
    { 
    } 

    Tuple(const first_t&& A, arg_v&& ... args) : 
     element(A), Tuple<arg_v ...>::Tuple(args ...) 
    { 
    } 

    first_t element; 
}; 

template<typename last_t> 
class Tuple<last_t> 
{ 
public: 
    Tuple() 
    { 
    } 

    Tuple(const last_t& A) : 
     element(A) 
    { 
    } 

    Tuple(const last_t&& A) : 
     element(A) 
    { 
    } 
    last_t element; 
}; 
+1

您可以查看boost :: tuple或std :: tuple的源代码以获取指导。 –

+0

你的移动构造函数不正确 - 'const &&不是你可以移动的东西,然后你也不会从任何东西移动。 – Barry

回答

1

我使用了递归方法。 我知道指向void的指针是邪恶的,但我们不知道哪个类型将被返回,只有谁在使用代码才知道它;我们想要的类型只能在最后的get之前执行。

请记住,这段代码会将void*转换为你想要的东西而不做任何检查。

class Tuple : public Tuple<arg_v ...> 
{ 
    template<typename T> 
    void get(int index, T& out) 
    { 
     out = *static_cast<T*>(get(index)); 
    } 

    void* get(unsigned int index) 
    { 
     if (index == 0) 
      return &element; 
     else 
      return Tuple<arg_v ...>::get(index - 1); 
    } 
}; 
class Tuple<last_t> 
{ 
    void* get(unsigned int) 
    { 
     return &element; 
    } 
}; 
+1

'static_cast >'复制 –

+1

我改变了它,现在它没有强制转换就访问基类。谢谢。 – FedeWar

相关问题