如何用可变参数模板与折叠表达式实现指定std::variant类型定义?
正确实现模板别名Type的方法
你的核心需求是定义一个模板别名,将传入的参数包中每个类型都包装成std::shared_ptr后,组合成std::variant类型。
正确代码实现
#include <variant> #include <memory> template<typename... Ts> using Type = std::variant<std::shared_ptr<Ts>...>;
原代码错误原因
你之前写的((std::shared_ptr<Ts>), ...)误用了逗号表达式的折叠。逗号表达式的特性是:会依次执行所有子表达式,但最终只返回最后一个子表达式的结果。这意味着当参数包包含多个类型时,这个折叠表达式最终只会生成最后一个std::shared_ptr<Tn>类型,而std::variant需要的是一组类型的列表,不是单个类型,因此编译会报错。
直接展开std::shared_ptr<Ts>...就足够了——模板参数包的展开机制会自动把每个Ts分别替换为std::shared_ptr<Ts>,并作为独立的模板参数传递给std::variant,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Deratelo
相关产品推荐
相关产品推荐

