Xir*_*ema 2 c++ c++11 stdtuple c++17
我有一个功能(简化逻辑后)采取的形式
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));
}
Run Code Online (Sandbox Code Playgroud)
我想对这个函数进行模板化处理,以便它可以处理用户传入的数据集.
auto [serif, sansserif, monospace] = get_font_heaps(serif_data, sansserif_data, monospace_data);
auto [comic_sans] = get_font_heaps(comic_sans_data);
Run Code Online (Sandbox Code Playgroud)
我开始试图像这样重写逻辑:
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)...);
}
Run Code Online (Sandbox Code Playgroud)
但很明显,即使这个编译,它也不能完全按照我想要的方式执行:它在表单中创建了一个嵌套的元组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(我怀疑它会大大简化逻辑).
好像你只是想要
template <class... Data>
auto get_font_heaps(Data const&... d) {
return std::make_tuple(get_font_heap_from_data(d)...);
}
Run Code Online (Sandbox Code Playgroud)
这是C++ 14.我们甚至可以使用别名丢弃其输入来使用C++ 11:
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)...);
}
Run Code Online (Sandbox Code Playgroud)
TC在评论中提出了一个很好的观点.由于我们所有类型都相同,我们应该返回一个std::array而不是std::tuple:
template <class... Data>
std::array<font_heap, sizeof...(Data)>
get_font_heaps(Data const&... d) {
return {{get_font_heap_from_data(d)...}};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |