如何编写函数模板判断任意两个std::variant是否持有相同类型?
判断任意两个std::variant是否持有相同类型的函数模板实现
问题背景
现有针对同类型std::variant的类型判断函数,但无法直接扩展到异构std::variant(即两个variant的备选类型集合不同)。原函数依赖参数包展开,会因类型不匹配导致编译错误。
解决方案
利用std::visit动态获取两个variant当前持有的具体类型,再通过编译期类型比较判断是否相同。这种方式无需依赖参数包,天然支持异构variant。
完整代码实现
#include <variant> #include <type_traits> #include <iostream> struct foo {}; struct bar {}; struct quux {}; struct mumble {}; template<typename Var1, typename Var2> bool hold_same_types(const Var1& v1, const Var2& v2) { return std::visit([&](const auto& val1) { return std::visit([&](const auto& val2) { return std::is_same_v<std::decay_t<decltype(val1)>, std::decay_t<decltype(val2)>>; }, v2); }, v1); } int main() { using var1 = std::variant<foo, bar, quux>; using var2 = std::variant<bar, quux, mumble>; var1 b1 = bar{}; var1 b2 = bar{}; var1 q = quux{}; var2 m = mumble{}; var2 b3 = bar{}; std::cout << std::boolalpha; std::cout << "(b1, b2) => " << hold_same_types(b1, b2) << "\n"; std::cout << "(b1, q) => " << hold_same_types(b1, q) << "\n"; std::cout << "(b1, m) => " << hold_same_types(b1, m) << "\n"; std::cout << "(b1, b3) => " << hold_same_types(b1, b3) << "\n"; }
代码说明
std::visit的作用:std::visit会根据variant当前持有的值,自动匹配对应的lambda表达式参数类型,从而动态获取当前值的具体类型。- 类型比较:通过
std::is_same_v编译期判断两个值的类型是否完全相同,std::decay_t用于去除引用和cv限定符,确保原始类型的比较准确。 - 兼容性:该模板支持任意类型的std::variant,无论两个variant的备选类型集合是否重叠,都能正确判断当前持有类型是否一致。
输出结果
(b1, b2) => true (b1, q) => false (b1, m) => false (b1, b3) => true
内容的提问来源于stack exchange,提问作者jwezorek
相关产品推荐
相关产品推荐

