如何从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
相关产品推荐
相关产品推荐

