Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何基于sizt\U t的模板参数包构造类模板的元组类型。。。Ints?_C++_Tuples_C++17_Template Meta Programming - Fatal编程技术网

C++ 如何基于sizt\U t的模板参数包构造类模板的元组类型。。。Ints?

C++ 如何基于sizt\U t的模板参数包构造类模板的元组类型。。。Ints?,c++,tuples,c++17,template-meta-programming,C++,Tuples,C++17,Template Meta Programming,在c++17的上下文中,如何构造以下元组类型(如何实现TypeMaker) 模板 甲级{ // ... } 模板 B类{ // ... } 模板 结构打字机{ //问题是 //使用typeA=。。。 //使用typeB=。。。 } typeA和typeB是这样的: typename TypeMaker<3, 5, 2, 10>::typeA -----> std::tuple<A<3, 5>, A<5, 2>, A<2, 10>&

在c++17的上下文中,如何构造以下元组类型(如何实现TypeMaker)

模板
甲级{
// ...
}
模板
B类{
// ...
}
模板
结构打字机{
//问题是
//使用typeA=。。。
//使用typeB=。。。
}
typeA和typeB是这样的:

typename TypeMaker<3, 5, 2, 10>::typeA  
-----> std::tuple<A<3, 5>, A<5, 2>, A<2, 10>>

typename TypeMaker<3, 5, 2, 10>::typeB
-----> std::tuple<B<5>, B<2>, B<10>> // drop first int 3

// sizeof...(Ints) has to be larger than 1 to have valid typeB
typename TypeMaker::typeA
----->std::tuple
typename TypeMaker::typeB
----->std::tuple//drop first int 3
//sizeof…(Ints)必须大于1才能具有有效的typeB
我正在寻找泛型类型生成器,因此相同的代码将在不同的数字上工作,例如:

TypeMaker<1, 2>, TypeMaker<3, 5, 3>, TypeMaker<1, 3, 9, 3, 10, 88, 128> ....
TypeMaker,TypeMaker,TypeMaker。。。。

我有一种感觉,这可以递归地进行,但不确定如何进行。

大概是这样的:

template <size_t... Ints>
struct TypeMaker {
private:
  using Numbers = std::tuple<std::integral_constant<size_t, Ints>...>;
  template <size_t N>
  static constexpr size_t Number = std::tuple_element_t<N, Numbers>::value;

  template <size_t... Indexes>
  static std::tuple<A<Number<Indexes>, Number<Indexes + 1>>...>
  MakeA(std::index_sequence<Indexes...>);

  template <size_t... Indexes>
  static std::tuple<B<Number<Indexes + 1>>...>
  MakeB(std::index_sequence<Indexes...>);

public:
  using typeA = decltype(MakeA(std::make_index_sequence<sizeof...(Ints)-1>()));
  using typeB = decltype(MakeB(std::make_index_sequence<sizeof...(Ints)-1>()));
};
模板
结构打字机{
私人:
使用Numbers=std::tuple;
模板
静态constexpr size\u t Number=std::tuple\u元素\u t::value;
模板

静态std::tuple

我假设这不是你想要的?如果不是,你能说明变量部分是如何工作的吗?不是我想要的。整数的数量并不总是等于4,可以是任何大于1的整数。我想要一个通用的实现,所以当使用不同的整数时,我不需要编写新代码。例如:TypeMaker,TypeMaker,…sho我想用相同的代码生成,谢谢!
template <size_t... Ints>
struct TypeMaker {
private:
  using Numbers = std::tuple<std::integral_constant<size_t, Ints>...>;
  template <size_t N>
  static constexpr size_t Number = std::tuple_element_t<N, Numbers>::value;

  template <size_t... Indexes>
  static std::tuple<A<Number<Indexes>, Number<Indexes + 1>>...>
  MakeA(std::index_sequence<Indexes...>);

  template <size_t... Indexes>
  static std::tuple<B<Number<Indexes + 1>>...>
  MakeB(std::index_sequence<Indexes...>);

public:
  using typeA = decltype(MakeA(std::make_index_sequence<sizeof...(Ints)-1>()));
  using typeB = decltype(MakeB(std::make_index_sequence<sizeof...(Ints)-1>()));
};