【问题标题】:Variadic variadic template template parameters可变参数 可变参数模板 模板参数
【发布时间】:2016-12-01 09:31:45
【问题描述】:

有没有一种简单的方法来获得可变参数模板模板参数。例如考虑以下函数签名

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

如果我们想传递两个Packs,我们现在必须做一个重载

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);

【问题讨论】:

  • TArgs 需要做什么?您最好使用template &lt;typename...Ts&gt; 并编写一些简单的特征来提取您需要的内容。
  • @Klaus 实际上,是的,你可以... See for yourself
  • 为什么参数只有一次?应该是“Variadic variadic template parameters 模板参数”
  • 哈哈,开个玩笑

标签: c++ c++11 variadic-templates variadic-functions template-templates


【解决方案1】:

我只会使用普通的可变参数模板:

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

}

然后编写一个特征来提取类型和size_ts。您可以轻松添加一些辅助别名模板来做任何您想做的事情。

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 中,您可以提取参数并随意使用它们。例如,要从包中获取包含所有Ts 的std::tuple

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

【讨论】:

    【解决方案2】:

    我建议你以这种方式递归地管理 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 模板参数。

    【讨论】:

    • 这个解决方案实际上效果很好。您可以使用多种模板类型调用foo,包括那些(与std::array 不同)采用多个size_t 模板参数的模板类型。
    • @Smeeheey - 确切地说:适用于具有可变 std::size_t 模板参数数量的多种模板类型。我已经修改了试图强调它的示例。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2023-03-07
    • 2013-09-22
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多