如何扩展元组以匹配提供的参数?

时间:2017-09-02 16:48:56

标签: c++ c++11 c++17 stdtuple

我有一个函数(在简化逻辑之后)采用

形式
std::tuple<font_heap, font_heap> get_font_heaps(std::vector<uint8_t> const& a, std::vector<uint8_t> const& b) {
    return std::make_tuple(get_font_heap_from_data(a), get_font_heap_from_data(b));
}

我希望将此功能模板化,以便它可以处理用户传入的数据集。

auto [serif, sansserif, monospace] = get_font_heaps(serif_data, sansserif_data, monospace_data);
auto [comic_sans] = get_font_heaps(comic_sans_data);

我开始试图像这样重写逻辑:

template<typename ... FontDatas>
auto get_font_heaps(std::vector<uint8_t> const& data, FontData&& ...datas) {
    if constexpr(sizeof...(FontDatas) == 0) {
        return std::make_tuple(get_font_heap_from_data(data));
    else {
        return std::make_tuple(get_font_heap_from_data(data), get_font_heaps(std::forward<FontDatas>(datas)...);
}

但显然,即使这个编译,它也不会完全做我想要的事情:它以std::tuple<font_heap, std::tuple<font_heap, std::tuple<font_heap>>>的形式从这段代码中创建一个嵌套的元组,而我想要的std::tuple<font_heap, font_heap, font_heap>

我怎样才能重写这个逻辑来做我想做的事情?我使用的是MSVC 2017.3,所以我可以访问很多C ++ 17的功能,但不能访问Fold Expressions(我怀疑它会大大简化逻辑)。

1 个答案:

答案 0 :(得分:5)

好像你只想要

zs = intersectBy ((==) `on` fst) xs ys

那是C ++ 14。我们甚至可以使用别名丢弃其输入来使用C ++ 11:

template <class... Data>
auto get_font_heaps(Data const&... d) {
    return std::make_tuple(get_font_heap_from_data(d)...);
}

T.C.在评论中提出了一个很好的观点。由于我们所有类型都相同,我们应该返回template <class T> using font_heap_t = font_heap; template <class... Data> std::tuple<font_heap_t<Data>...> get_font_heaps(Data const&... d) { return std::make_tuple(get_font_heap_from_data(d)...); } 而不是std::array

std::tuple