用mapbox的变体访问实现替换std::visit

问题描述 投票:0回答:1

我目前正在将 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()

现在我没有主意了。有人可以帮忙吗?

c++
1个回答
0
投票

正如HolyBlackCat在上面的评论中所建议的,解决方案是将

visit
替换为
apply_visitor
,即

std::string XLSheet::name() const
{
    return mapbox::util::apply_visitor([](auto&& arg) { return arg.name(); }, m_sheet);
}

这个就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.