C++ 模板元编程:如何将参数包组合到新的参数包
我试图实现一种从元组中删除某些类型的方法;例如,我希望能够(例如)根据条件,仅获取元组的前2个模板参数中的一个元组: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; }; }; 使用
#包括
#包括
模板结构辅助程序{
模板结构获取{
使用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!
};