3

我有一个容器类,它接受一个vectorarray对象列表(并存储对原始对象列表的引用元组)。现在,当通过调用容器时,operator()(size_t idx)我希望函数返回一个元组,其中包含idx每个向量/数组索引处的元素。

    template<class... Ts>
    class Container
    {
    public:
        Container(const Ts&... objs)
            : m_data(objs...) { }

        auto operator()(size_t idx) const
        {
            const auto get_idx = [idx](const auto& obj) { return obj.at(idx);  };
            return std::tuple<const Ts::value_type& ...>((get_idx(m_data), ...));  // <-- does not compile
        }

    private:
        std::tuple<const Ts&...> m_data;
    };

    int main()
    {
        std::vector<int> v1{ 3,4,12,5 };
        std::vector<std::string> v2{ "on", "test", "ABC", "house" };
        std::array<double, 4> v3 = { 3.14, 2.71, 99.3, 128 };

        const auto z = Container(v1, v2, v3);

        auto v = z(2);  // <-- does not compile
        return 0;
    }

例如,z(2)上面应该等于std::tuple<int, std::string, double>(12, "ABC", 99.3)。我将如何实现这一目标?

4

1 回答 1

4

你有一个tuple,你需要把它变成一个包。这样做的方法是std::apply()

auto operator()(size_t idx) const
{
    return std::apply([=](auto const&... xs){
        return std::make_tuple(xs.at(idx)...);
    }, m_data);
}

xs这是一个包,它指的是m_data. 一旦我们有了这个包,用它做任何事情都很简单。

于 2020-02-18T18:38:01.830 回答