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

如何从boost::variant构造std::variant?转换函数实现问询

实现boost::variant到std::variant的转换

可以直接借助boost::apply_visitor实现这个转换,完全贴合你的需求,不需要绕tuple这类中间结构。核心思路是利用boost变体的访问器机制,匹配当前存储的实际类型,直接构造对应的std变体。

基础实现(匹配你给出的函数签名)

#include <boost/variant.hpp>
#include <variant>

template <typename... Types>
std::variant<Types...> boostvar2stdvar(boost::variant<Types...> input) {
    return boost::apply_visitor(
        [](auto&& value) -> std::variant<Types...> {
            return std::forward<decltype(value)>(value);
        },
        input
    );
}

原理说明

boost::apply_visitor会根据input当前存储的实际类型,调用对应的lambda重载;而std::variant<Types...>支持从它的任意备选类型直接构造,所以lambda返回的构造操作完全合法,一步完成转换。

扩展:支持左值/右值的通用版本

如果需要处理非拷贝场景(比如移动语义),可以重载两个版本覆盖左值和右值:

// 处理右值引用
template <typename... Types>
std::variant<Types...> boostvar2stdvar(boost::variant<Types...>&& input) {
    return boost::apply_visitor(
        [](auto&& value) -> std::variant<Types...> {
            return std::forward<decltype(value)>(value);
        },
        std::move(input)
    );
}

// 处理const左值引用
template <typename... Types>
std::variant<Types...> boostvar2stdvar(const boost::variant<Types...>& input) {
    return boost::apply_visitor(
        [](const auto& value) -> std::variant<Types...> {
            return value;
        },
        input
    );
}

测试示例

#include <iostream>
#include <string>

int main() {
    boost::variant<int, std::string> b_var = "hello boost";
    auto s_var = boostvar2stdvar(b_var);

    std::visit([](const auto& val) {
        std::cout << "Value: " << val << std::endl;
    }, s_var);

    b_var = 42;
    s_var = boostvar2stdvar(std::move(b_var));
    std::visit([](const auto& val) {
        std::cout << "Value: " << val << std::endl;
    }, s_var);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:05:25