我正在尝试实现一种从元组中删除某些类型的方法;例如,我希望能够根据条件仅将前 2 个模板参数中的一个元组用于元组:
- 是否可以将元组包含的类型“打包”回参数包中?(元组 -> 类型名...包含类型)
- 是否可以组合一个参数。带有类型名的包(例如,使用“Pack1...,Pack2...”为结构指定单个参数包?
#include <cstdint>
#include <tuple>
template <typename... tpl> struct Helper {
template <std::size_t rem, typename curr, typename... rest> struct take {
using type = Helper<(tpl..., curr)>::take<rem-1, rest...>::type; // here, I'm trying (2.)
};
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> k = std::make_tuple(1, 2);
}
编辑行 Helper 失败并显示以下消息:
/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;
当我提供 typename
/home/juli/test.cc:6:53: error: expected ‘;’ before ‘<’ token
6 | using type = typename Helper<tpl..., curr>::take<rem-1, rest...>::type;
编辑2 我通过[辅助函数](https://gist.github.com/juliusHuelsmann/669f537aeb5e7105386d510d186b24e1 )实现了这一点,但是当构造函数不是 constexpr 时,那些非原始类型会失败,所以我不能在我的用例中使用它并且很好奇知道如何实现这一目标以及我的方法失败的原因。