我如何实现一个函数来提取这个类的元素?

时间:2016-05-09 18:56:49

标签: c++ templates tuples generic-programming

我正在乱用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 个答案:

答案 0 :(得分: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;
    }
};