如何将元组<>重新删回到可变参数类型的模板列表中?

kfm*_*e04 13 c++ templates std variadic-templates c++11

有没有办法去除一个std::tuple<T...>以便让它回来T...

假设vct<T...>是一个预先存在的 可变参数类模板,

using U = std::tuple<int,char,std::string>;
using X = vct<int,char,std::string>;
using Y = vct< strip<U> >;            // should be same as X
Run Code Online (Sandbox Code Playgroud)

笔记

我知道std :: tuple_element,但我需要所有元素,以一种可用的形式T...

作为参考,我发现这个问题,这是类似的,但我的需求是较为简单(所以我希望有一个简单的解决方案):我需要的是那些在类型列表tuple-我不关心tuple实例的实际值.

Naw*_*waz 14

template<typename>
struct strip;

template<typename ...T>
struct strip<std::tuple<T...>>
{
   using type = vct<T...>;
};
Run Code Online (Sandbox Code Playgroud)

然后用它作为:

using Y = strip<U>::type;
Run Code Online (Sandbox Code Playgroud)

现在Y和...一样X.


And*_*owl 11

不,这是不可能的.参数包是类型推导的结果,它们不能在其他上下文中生成.

您可以采取类似于您所要求的方式:

template<template<typename...> class T, typename>
struct instantiate_with_arg_pack { };

template<template<typename...> class T, typename... Ts>
struct instantiate_with_arg_pack<T, std::tuple<Ts...>>
{
    using type = T<Ts...>;
};

template<typename... Ts>
struct vct { };

int main()
{
    using U = std::tuple<int,char,std::string>;
    using X = vct<int,char,std::string>;
    using Y = instantiate_with_arg_pack<vct, U>::type;
}
Run Code Online (Sandbox Code Playgroud)

实际上,您不需要在元组中保存参数包:任何可变参数类模板都可以:

template<template<typename...> class T, typename>
struct instantiate_with_arg_pack { };

template<
    template<typename...> class T, 
    template<typename...> class U, // <===
    typename... Ts
    >
struct instantiate_with_arg_pack<T, U<Ts...>>
//                                   ^^^^^^^^
{
    using type = T<Ts...>;
};

template<typename... Ts>
struct vct { };

int main()
{
    using U = std::tuple<int,char,std::string>;
    using X = vct<int,char,std::string>;
    using Y = instantiate_with_arg_pack<vct, X>::type;
    //                                        ^

    // Won't fire
    static_assert(
        std::is_same<Y, vct<int,char,std::string>>::value, 
        "Error!");
}
Run Code Online (Sandbox Code Playgroud)

这是一个实例.

  • 使用模板模板参数+1 Nice touch. (3认同)

Dan*_*rey 5

你不能直接“返回”参数包,所以你需要的是这样的:

template< typename... Ts >
struct vct
{ ... };

template< typename >
struct make_vct;

template< typename... Ts >
struct make_vct< std::tuple< Ts... > >
{
    typedef vct< Ts... > type;
};
Run Code Online (Sandbox Code Playgroud)

并使用

using Y = make_vct< U >::type;
Run Code Online (Sandbox Code Playgroud)