You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写函数模板判断任意两个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";
}

代码说明

  1. std::visit的作用:std::visit会根据variant当前持有的值,自动匹配对应的lambda表达式参数类型,从而动态获取当前值的具体类型。
  2. 类型比较:通过std::is_same_v编译期判断两个值的类型是否完全相同,std::decay_t用于去除引用和cv限定符,确保原始类型的比较准确。
  3. 兼容性:该模板支持任意类型的std::variant,无论两个variant的备选类型集合是否重叠,都能正确判断当前持有类型是否一致。

输出结果

(b1, b2) => true
(b1, q) => false
(b1, m) => false
(b1, b3) => true

内容的提问来源于stack exchange,提问作者jwezorek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:35:06