tuple本身就是一种结构体,但是是一个模板类。利用形参包(Parameter pack)。C++ std::tuple的原理及简易实现,靠着模板元的递归实现的,相当抽象。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<typename...Args>
struct tuple;

// 当元组中没有元素时,递归结束
template<>
struct tuple<> {
    constexpr tuple() noexcept = default;
    constexpr tuple(const tuple &) noexcept {};
    constexpr tuple &operator=(const tuple &) = default;
};

// 当元组中有一个或多个元素时,将第一个元素的类型分离出来,并通过继承,将剩下的元素作为另一个元组处理。
template<typename head, typename...Args>
struct tuple<head, Args...> : tuple<Args...> {
    using base_ = tuple<Args...>;

    template<typename head_, typename...Args_>
    constexpr tuple(head_ &&val, Args_ &&...args) :
        head_val_(std::forward<head_>(val)), base_(std::forward<Args_>(args)...) {}

    tuple_val_<head> head_val_;
};

类模板实参推导(CTAD)(C++17 起)