将函数应用于向量元组以获得元素元组(可变模板)

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)。我该怎么做呢?
1个回答

4
你有一个元组(tuple),需要将其转换为包(pack)。实现这一目标的方法是使用 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 的内容。一旦我们有了这个包,对它进行任何操作都很简单。


这很完美,谢谢。顺便问一下,有没有一种有效的方法来检查Container(const Ts&... objs)中的所有输入是否具有相同的大小?我只想到了const size_t N = std::get<0>(m_data).size(); auto check_same = [N](const auto& obj) { if (N != obj.size()) throw; }; (check_same(objs), ...); - Phil-ZXX
@Phil-ZXX std::array<std::size_t, sizeof...(objs)> arr{ objs.size()... }; if (std::unique( arr.begin(), arr.end() )-arr.begin() != 1) { throw; } - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接