Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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++ 多次解包参数包_C++_C++11_Templates_Tuples_Variadic Templates - Fatal编程技术网

C++ 多次解包参数包

C++ 多次解包参数包,c++,c++11,templates,tuples,variadic-templates,C++,C++11,Templates,Tuples,Variadic Templates,是否可以多次解包参数包 例如:我想得到一个包含4个向量的元组-2个int类型的向量和2个float类型的向量。 要创建这样的元组,我希望使用以下语法: ExampleClass<2, int, float> class; ExampleClass; 有可能创建这样一个类吗?我在想这样的事情: template <int numUnpacks, typename ... Types> class ExampleClass { using Types = std

是否可以多次解包参数包

例如:我想得到一个包含4个向量的元组-2个int类型的向量和2个float类型的向量。 要创建这样的元组,我希望使用以下语法:

ExampleClass<2, int, float> class;
ExampleClass;
有可能创建这样一个类吗?我在想这样的事情:

template <int numUnpacks, typename ... Types>
class ExampleClass
{
     using Types = std::tuple<std::vector<Types>...>; // here i don't know how to unpack "std::vector<Types>...>" as often as "numUnpacks">
}
模板
类示例类
{
使用Types=std::tuple;//在这里,我不知道如何像“numUnpacks”>
}

使用通常的递归模板部分专门化似乎很简单:

template<int n,class T,class... TT>
struct Impl;

template<int n,class... TT,class... UU>
struct Impl<n,std::tuple<TT...>,UU...> :
  Impl<n-1,std::tuple<TT...,UU...>,UU...> {};

template<class... TT,class... UU>  // just "class T" would be ambiguous
struct Impl<0,std::tuple<TT...>,UU...>
{using Types=std::tuple<std::vector<TT>...>;};

template<int n,class... TT>
struct ExampleClass : Impl<n,std::tuple<>,TT...> {};
模板
结构Impl;
模板
结构Impl:
Impl{};
模板//仅“T类”是不明确的
结构Impl
{using Types=std::tuple;};
模板
结构示例类:Impl{};

诀窍是尽早创建一个
元组
,这样我们一次可以保存多个模板参数包。

这可以使用C++14来完成。如果你没有,这里有一个

模板
结构示例类
{
模板
使用T_别名=T;
模板
结构重复;
模板
结构重复{
使用type=decltype(std::tuple_cat(std::declval()…);
};
使用type=typename repeat::type;
};
ExampleClass::type
std::tuple

template <int numUnpacks, typename... Types>
struct ExampleClass
{
    template<typename T, size_t>
    using T_alias = T;

    template<typename T, size_t N, typename I = std::make_index_sequence<N>>
    struct repeat;

    template<typename T, size_t N, size_t... I>
    struct repeat<T, N, std::index_sequence<I...>> {
        using type = decltype(std::tuple_cat(std::declval<T_alias<T, I>>()...));
    };

    using type = typename repeat<std::tuple<std::vector<Types>...>, numUnpacks>::type;
};