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)
这是一个实例.
你不能直接“返回”参数包,所以你需要的是这样的:
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)