Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates_C++11_Variadic Templates - Fatal编程技术网

C++ 是否可以键入定义参数包?

C++ 是否可以键入定义参数包?,c++,templates,c++11,variadic-templates,C++,Templates,C++11,Variadic Templates,是否可以键入定义参数包?比如说 template<class T, class... Args> struct A { typedef T Type; // We typedef it, then its derived class can use it. // How about for parameter packs? // Option 1: typedef Args Arguments; // Opt

是否可以键入定义参数包?比如说

template<class T, class... Args>
struct A
{
    typedef T Type; // We typedef it, then its derived class can use it.
                    // How about for parameter packs?

    // Option 1:
    typedef Args Arguments;

    // Option 2:
    using Arguments = Args;

    // Option 3: I can put in a tuple, but how can I untuple it to a pack
    typedef tuple<Args...> Tuple;
};
模板
结构A
{
typedef T Type;//我们定义它,然后它的派生类可以使用它。
//参数包呢?
//备选案文1:
typedef参数;
//备选案文2:
使用参数=Args;
//选项3:我可以放入一个元组,但如何将其解耦合到一个包
typedef元组;
};
我想使用上述技术实现以下功能

template<int... VALUES>
struct IntegralSequence
{
    enum { SIZE = sizeof...(VALUES) };

    template <unsigned I>
    struct At
    {
        enum { VALUE = typename tuple_element<I, 
                       tuple<integral_constant<int, VALUES>...>>::type::value
             };
    };
};

template<unsigned N>
struct AscendingSequence
{
    typedef IntegralSequence<AscendingSequence<N-1>::VALUES..., N> Type;
    using VALUES = Type::VALUES; // if it works
};

template<>
struct AscendingSequence<1>
{
    typedef IntegralSequence<0> Type;
    using VALUES = Type::VALUES; // if it works
};
模板
结构积分序列
{
枚举{SIZE=sizeof…(值)};
模板
结构在
{
枚举{VALUE=typename元组元素::类型::值
};
};
};
模板
结构上升序列
{
typedef积分序列类型;
使用VALUES=Type::VALUES;//如果有效
};
模板
结构上升序列
{
typedef积分序列类型;
使用VALUES=Type::VALUES;//如果有效
};

您可以将它们打包到
元组中,或者打包到任意的空类模板中(我更喜欢称之为
pack
):

pack
在这样的情况下,空着很方便。否则,您需要一些其他方法来传递
args
,而不实际传递包含数据的
tuple
(例如,将其包装到另一个空结构中)

或者,在类模板专门化中:

template<typename T, typename = typename T::args>
struct B_impl;

template<typename T, typename... Args>
struct B_impl <T, pack<Args...> >
{
    // use Args... here
};

template<typename T>
using B = B_impl<T>;
模板
结构B_impl;
模板

struct B_impl“我可以放入一个元组,但如何将其解耦合到一个包”使用部分专门化、演绎或索引技巧。。。args如果您可以粗略地描述用例,即您想在哪里解包它们,那么构建一个工作示例可能会更容易。(@dyp给出了三种可能性,但每种都适用于有限的用例集)+1对于使用非元组的包装器类型,这都是关于关注点的分离。我只是想自己实现make_integer_序列,然后弹出这个问题。@user1899020我不相信!这看起来像是一个X-ABCDEF-Y问题:-)作为一个骑自行车的人,我喜欢调用
pack
types
:描述它的内容,而不是它的来源。Plus类型不是参数包的唯一类型。@Yakk True。不幸的是,在我的项目中,我有一个名为
types
的名称空间,其中所有元编程都发生在:-)
template<typename... Args, typename A>
void f(pack<Args...>, A a) { /* use Args... here */ }

template<typename A>
void f(A a) { f(typename A::args(), a); }
template<typename T, typename = typename T::args>
struct B_impl;

template<typename T, typename... Args>
struct B_impl <T, pack<Args...> >
{
    // use Args... here
};

template<typename T>
using B = B_impl<T>;