C++ 模板元编程:如何将参数包组合到新的参数包

C++ 模板元编程:如何将参数包组合到新的参数包,c++,tuples,template-meta-programming,parameter-pack,C++,Tuples,Template Meta Programming,Parameter Pack,我试图实现一种从元组中删除某些类型的方法;例如,我希望能够(例如)根据条件,仅获取元组的前2个模板参数中的一个元组: 是否可以将元组包含的类型“打包”回参数包?(元组->类型名称…包含的类型) 是否可以合并参数。使用类型名打包(例如,使用“Pack1…,Pack2…”为结构指定单个参数包 #包括 #包括 模板结构辅助程序{ 模板结构获取{ 使用type=Helper::take::type;//在这里,我正在尝试(2) }; 模板结构获取{ 使用type=std::tuple; }; }; 使用

我试图实现一种从元组中删除某些类型的方法;例如,我希望能够(例如)根据条件,仅获取元组的前2个模板参数中的一个元组:

  • 是否可以将元组包含的类型“打包”回参数包?(元组->类型名称…包含的类型)
  • 是否可以合并参数。使用类型名打包(例如,使用“Pack1…,Pack2…”为结构指定单个参数包
  • #包括
    #包括
    模板结构辅助程序{
    模板结构获取{
    使用type=Helper::take::type;//在这里,我正在尝试(2)
    };
    模板结构获取{
    使用type=std::tuple;
    };
    };
    使用take\u t=Helper::take的模板;
    int main(){
    take_t k=std::make_tuple(1,2);
    }
    
    编辑行辅助程序失败,并显示以下消息:

    /home/juli/test.cc:6:18: error: need ‘typename’ before ‘Helper<tpl ..., curr>::take’ because ‘Helper<tpl ..., curr>’ is a dependent scope
        6 |     using type = Helper<tpl..., curr>::take<rem-1, rest...>::type;
    
    /home/juli/test.cc:6:18:错误:需要在“Helper::take”之前加上“typename”,因为“Helper”是一个从属作用域
    6 |使用type=Helper::take::type;
    
    当我提供typename时

    /home/juli/test.cc:6:53: error: expected ‘;’ before ‘<’ token
        6 |     using type = typename Helper<tpl..., curr>::take<rem-1, rest...>::type;
    

    /home/juli/test.cc:6:53:错误:应为“;”before“问题2的答案
    是的,这是可能的,正如@user253751所建议的,我最初的方法(
    Helper
    )是正确的,但是我犯了一个不同的错误,在使用的类型之后省略了“template”,导致了该行中的上述错误。 下面的代码显示了修复程序,工作正常:

    #include <cstdint>
    #include <tuple>
    
    template <typename... tpl> struct Helper {
      template <std::size_t rem, typename curr, typename... rest> struct take {
        using tp = Helper<tpl..., curr>;
        using type = tp::template take<rem-1, rest...>::type;
      };
    
      template <typename curr, typename... rest> struct take<0, curr, rest...> {
        using type = std::tuple<tpl...>;
      };
    };
    
    template <std::size_t s, typename... tpl> using take_t = Helper<>::take<s, tpl...>;
    
    int main() {
      take_t<2, int, int, int>::type k = std::make_tuple(1, 2);
    }
    
    #包括
    #包括
    模板结构辅助程序{
    模板结构获取{
    使用tp=Helper;
    使用type=tp::template take::type;
    };
    模板结构获取{
    使用type=std::tuple;
    };
    };
    使用take\u t=Helper::take的模板;
    int main(){
    take_t::type k=std::make_tuple(1,2);
    }
    
    问题1的答案由所执行的技巧给出,请参见完整示例。例如,可以通过以下构造(根据动态和未测试的示例改编):

    模板结构foo;
    
    template struct Foo无法贡献,但出于好奇…,这是什么意思?我知道它是可变的,但为什么typename。。。tpl而不是typename tpl@StefanoBorini看到了:那么你想从中获取一个
    std::tuple
    并从中获取一个
    std::tuple
    ?相关/重复:
    Helper
    有什么问题?
    template <class tuple> struct foo;
    
    template <class ... args> struct foo<std::tuple<args...> {
        // implementation here!
    };