我目前正在将 C++17 代码向下移植到 C++14。由于 C++14 没有
variant
,我正在使用 variant
的 mapbox 实现,可以在 here 获得。基本上,使用 variant
替换 mapbox::util::variant
效果很好,但有一件事我无法开始工作,那就是用 Mapbox 的调用替换对 std::visit
的调用。原始代码如下所示:
std::string XLSheet::name() const
{
return std::visit([](auto&& arg) { return arg.name(); }, m_sheet);
}
我尝试像这样重写代码:
std::string XLSheet::name() const
{
return mapbox::util::variant::visit([](auto&& arg) { return arg.name(); }, m_sheet);
}
但这不起作用。我收到以下错误:
template <class ... Types> class mapbox::util::variant used without template parameters
那么我应该传递什么作为模板参数呢?我对 C++ 完全没有经验。
m_sheet
被定义为 mapbox::util::variant<XLWorksheet, XLChartsheet> m_sheet;
所以我也尝试像这样重写代码:
std::string XLSheet::name() const
{
return mapbox::util::variant<XLWorksheet, XLChartsheet>::visit([](auto&& arg) { return arg.name(); }, m_sheet);
}
但是我收到以下错误:
no matching function call to mapbox::util::variant<OpenXLSX::XLWorksheet, OpenXLSX::XLChartsheet>::visit()
现在我没有主意了。有人可以帮忙吗?
正如HolyBlackCat在上面的评论中所建议的,解决方案是将
visit
替换为apply_visitor
,即
std::string XLSheet::name() const
{
return mapbox::util::apply_visitor([](auto&& arg) { return arg.name(); }, m_sheet);
}
这个就可以了。