7

是否有直接的方法來使用可變參數模板參數。例如考慮下面的函數簽名可變參數模板模板參數

template<template<typename,size_t...> class Pack, 
    typename T, size_t ... Args> 
void foo(const Pack<T,Args...>& a); 

如果我們想傳遞兩個Pack一個值得我們現在做的過載

template<template<typename,size_t...> class Pack, 
    typename T, size_t ... Args0, size_t ... Args1> 
void foo(const Pack<T,Args0...>& a, const Pack<T,Args1...>& b); 

現在,如果我們想傳遞一個可變數量的Pack對象具有不同的可變參數,例如Args0...,Args1...,Args2...

所以我在想如果有一個實際的做法沿着線(下面肯定是一個草圖表示)。

template<template<typename,size_t...> ... class Pack, typename T,...> 
void foo(const Pack<T,...> ... packs); 
+0

你需要用'T'和'Args'做什麼?你最好使用'template '並寫一些簡單的特徵來提取你需要的東西。 – TartanLlama

+0

.....大聲笑.....? :D –

+0

@克勞斯其實,是的,你可以... [自己看看](http://coliru.stacked-crooked.com/a/1d822071ce2130bf) – Rerito

回答

5

我只想用一個正常的可變參數模板:

template<typename... Ts> 
void foo(const Ts&... packs) { 

} 

然後寫一個特徵提取的類型和size_t秒。你可以很容易地添加一些輔助別名模板來做你喜歡的任何事情。

template <typename T> struct extract_args; 

template <template <typename, size_t...> class Pack, typename T, size_t... Args> 
struct extract_args<Pack<T,Args...>> { 
    using type = T; 
    using args = std::index_sequence<Args...>; 
}; 

然後內foo您可以提取的參數,並且按照自己喜歡的方式使用它們。例如,從包裝獲得std::tuple包含所有T S:

using all_ts = std::tuple<typename extract_args<Ts>::type...>; 
3

我建議你遞歸管理Pack參數,這樣

#include <array> 

template <typename T, std::size_t ... Args> 
struct testS 
{ }; 

void foo() 
{ /* terminal iteration */ } 

template <template <typename, std::size_t...> class Pack, 
      typename T, std::size_t ... Args, typename ... Packs> 
void foo (const Pack<T, Args...> pack0, Packs ... packs) 
{ 
    // do something with pack0 

    foo(packs...); 
} 

int main() 
{ 
    foo(testS<int>{}, std::array<long, 5U>{}, testS<char, 7U, 9U, 11U>{}); 

    return 0; 
} 

---編輯---

修改示例以顯示使用不同類型和可變數量的std::size_t模板參數。

+0

這個解決方案實際上工作得很好。您可以使用多種模板類型來調用'foo',包括(不同於'std :: array')使用多個'size_t'模板參數。 – Smeeheey

+0

@Smeeheey - exact:與多個模板類型一起使用,使用變量std :: size_t多個模板參數。我修改了試圖強調它的示例。謝謝。 – max66