起因 Link to heading

想把 tuple 封装进一个自己的子类里,在构建函数时候传入我想要的参数,直接 move 进 tuple 容器。

问题 Link to heading

模板参数的展开与 fold expression 只是对每一个参数做同样的操作,但我现在希望把里 面的值取出 move 进另外一个 tuple 里,这个过程无法直接用上述方案处理,因为 tuple 里的索引是编译期传入的,没有办法通过循环等方式处理。

解决方法 Link to heading

思路很简单,template 的编程与函数式编程相似,那么我用递归不就好了。最终封出来的 类大致如下:

template <class... T>
class Foo {
public:
    Foo(std::vector<T>&&... args)
        : tpl(std::forward<std::vector<T>>(args)...)
    {}

    Foo(std::pair<T*, std::size_t>&&... args) {
        init_tpl<0>(std::make_tuple(
            std::forward<std::pair<T*, size_t>>(args)...
        ));
    }

    std::tuple<std::vector<T>...> tpl;

    template <size_t I>
    void init_tpl(std::tuple<std::pair<T*, std::size_t>...>&& args) {
        using std::get, std::back_inserter, std::copy_n;
        auto& p = get<I>(args).first;
        auto& n = get<I>(args).second;
        auto& v = get<I>(tpl);
        copy_n(p, n, std::back_inserter(v));
        if constexpr (I + 1 != sizeof... (T)) {
            init_tpl<I + 1>(
              std::forward<std::tuple<std::pair<T*, std::size_t>...>>(args)
            );
        }
    }
};

如果希望把每个 tuple 的元素做为参数传入某个函数,正常使用 expansion 和 comma operator 就好。

std::apply([&](auto &...element) { (f(element), ...); }, m_relations);