我有一个函数(在简化逻辑之后)采用
形式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(我怀疑它会大大简化逻辑)。
答案 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