如何将任意类型组合的std::variant作为重载函数的统一参数?
解决方案
你的实现思路是正确的,只需要将针对std::variant的func重载改为模板,匹配任意std::variant特化即可,不需要手动枚举所有可能的类型组合。
完整实现代码
#include <variant> #include <iostream> // 基础类型的func重载,可随时扩展更多类型 void func(int value) { std::cout << "调用int重载:" << value << "\n"; } void func(double value) { std::cout << "调用double重载:" << value << "\n"; } void func(bool value) { std::cout << "调用bool重载:" << std::boolalpha << value << "\n"; } // C++17 overload模式辅助类,用于std::visit分发 template<class... Ts> struct overload : Ts... { using Ts::operator()...; }; template<class... Ts> overload(Ts...) -> overload<Ts...>; // 匹配任意std::variant的通用func重载 template<class... VariantTs> void func(const std::variant<VariantTs...>& variant) { std::visit(overload{ [](const auto& value) { // 自动分发到对应类型的func重载 func(value); } }, variant); }
调用示例
int main() { std::variant<int, double> v1 = 3.14; std::variant<double, bool> v2 = true; std::variant<int, double, bool> v3 = 100; func(v1); // 输出:调用double重载:3.14 func(v2); // 输出:调用bool重载:true func(v3); // 输出:调用int重载:100 return 0; }
说明
- 依赖C17及以上标准,用到的类模板参数推导、折叠表达式、
std::visit均为C17引入特性 - 自动支持所有已实现
func重载的类型组合,后续新增类型的func重载时不需要修改通用variant版本的实现 - 类型安全:如果
std::variant中存在没有对应func重载的类型,会在编译阶段直接报错,无运行时风险 - 若需要修改variant内存储的值,去掉参数和lambda的
const限定,改为左值引用即可
内容的提问来源于stack exchange,提问作者user12061187
相关产品推荐
相关产品推荐

