2017-09-02 36 views
2

我有一個函數,(以後簡化邏輯)的形式爲如何展開元組以提供匹配參數?

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(我懷疑這會大大簡化邏輯)。

回答

5

好像你只是想

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

這是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)...); 
} 

T.C.使得一個好點的意見。因爲我們所有的類型都是一樣的,我們應該回到的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)...}}; 
} 
+0

如果類型是同質的,我會用'的std :: array'。 –