我有一个函数main_func
,其中我通过将参数包/变量模板转换为元组来对其进行修改。修改后,例如:original = tuple<int, float, string>
变成modified = tuple<int float>
我想将修改后的元组扩展为示例get_type_vector
中的另一个函数,以便参数包表示修改后的元组的类型{ {1}}。
Args = int, float
是否可以以某种方式扩展元组类型,例如参数包的类型?我发现了使用template<typename... Args>
void main_func()
{
// Modify the parameter pack (which if im correct can only be done by converting to tuple?)
using original = std::tuple<Args...>;
using modified = // something that alters the types of the original tuple
// This is what i want to accomplish
// somehow expand the tuple type like a parameter pack
auto vec = get_type_vector<modified...>()
}
// Returns a vector of type_info
template<typename... Args>
std::vector<type_info> get_type_vector()
{
return { type_info<Args>()... };
}
等的示例,但这要求您拥有一个值,而不仅仅是一个元组的typedef。
答案 0 :(得分:2)
您可以通过引入间接层轻松地扩展元组,间接层可以是lambda(C ++ 20)或模板函数(C ++ 11)。例如
std::tuple<int, float, char> t;
[]<typename... Ts>(std::tuple<Ts...>)
{
// use `Ts...` here
}(t);
在您的情况下:
template <typename T>
struct type_wrapper { using type = T; };
template<typename... Args>
std::vector<type_info> get_type_vector(type_wrapper<std::tuple<Args...>>)
{
return { type_info<Args>()... };
}
get_type_vector(type_wrapper<std::tuple<int, float, char>>{});
type_wrapper
类可防止在运行时无用的元组实例化。您可以在C ++ 20中使用std::type_identity
。
答案 1 :(得分:1)
一个相当简单的方法是重载,让编译器推断类型。 std::type_identity
在这里很有用(C ++ 20,但可以在任何版本的C ++中轻松复制)。它可以创建各种类型的简单廉价标签
template<typename... Args>
std::vector<type_info> get_type_vector(std::type_identity<std::tuple<Args...>>)
{
return { type_info<Args>()... };
}
使用它就是写
auto vec = get_type_vector(std::type_identity<modified>{})