C++如何通过编译期类型与运行时函数创建std::tuple
C++ 编译期构造确定类型std::tuple的实现方案
你要实现的需求有两种可行方案,确实可以通过std::index_sequence实现,也可以直接对模板参数包展开实现更简洁的写法。
最简实现(无需下标遍历)
你的场景下不需要额外遍历下标,模板参数包Ts...可以直接展开使用:
#include <tuple> template<typename T> T* create_obj(); // 外部已有实现 template<typename ...Ts> auto create_tuple() { // 直接展开参数包,依次调用对应类型的create_obj,拼接为tuple return std::make_tuple(create_obj<Ts>()...); }
该实现完全符合你给出的使用示例,调用create_tuple<A, B, C>()会直接返回std::tuple<A*, B*, C*>类型的结果。
基于std::index_sequence的实现
如果你后续逻辑需要用到编译期下标,可以按如下方式实现:
#include <tuple> #include <utility> // std::index_sequence 相关头文件 template<typename T> T* create_obj(); // 外部已有实现 // 辅助函数:接收编译期下标序列完成展开 template<typename Tuple, std::size_t... Idx> auto create_tuple_helper(std::index_sequence<Idx...>) { // 按下标取tuple对应类型,生成对象后拼接为结果tuple return std::make_tuple(create_obj<std::tuple_element_t<Idx, Tuple>>()...); } template<typename ...Ts> auto create_tuple() { // 生成和参数包长度匹配的编译期下标序列 using TupleType = std::tuple<Ts...>; return create_tuple_helper<TupleType>(std::make_index_sequence<sizeof...(Ts)>{}); }
实现说明
std::make_index_sequence<sizeof...(Ts)>会在编译期生成一个从0到sizeof...(Ts)-1的整数序列- 你原代码中的
std::tuple_element<Idx, Ts...>写法存在错误:std::tuple_element的第二个参数必须是tuple类型,不能直接传入参数包,需要先把Ts...包装为std::tuple<Ts...>类型再使用。
内容的提问来源于stack exchange,提问作者user5406764
相关产品推荐
相关产品推荐

