访问列表中的所有 std::variants 并为每次访问捕获一个额外的值
Visit all std::variants in a list and capture an additional value for every visit
我正在尝试实现一个状态存储,它基本上是一个键值对映射,其中值为 std::variant
。
以下 class 工作正常。请注意,它不仅打印访问值,还打印键:
class StateStoreTest
{
typedef std::variant<float, std::string> StateValue;
private:
std::map<int, StateValue> States;
public:
void SetValue(int key, const StateValue& value) { States[key] = value; }
void VisitAllValues()
{
for (auto& it : States)
{
auto key = it.first;
std::visit([key](auto&& value) { std::cout << key << "=" << value << "\n"; }, it.second);
}
}
};
我可以这样使用它并且输出符合预期:
StateStoreTest sst;
sst.SetValue(1, 123.4f);
sst.SetValue(2, "Test");
sst.VisitAllValues();
现在我不想在 VisitAllValues()
中实现特定的访问者实现,但我希望能够提供可调用 VisitAllValues()
方法的访问者。在那个可调用的访问者中,我想访问键和访问值。
所以基本上从呼叫者的角度来看,我希望能够做这样的事情:
sst.VisitAllValues([](auto key, auto&& value){ std::cout << key << "=" << value << "\n"; });
我想我的 VisitAllValues()
方法应该是这样的:
void VisitAllValues(??? visitor)
{
for (auto& it : States)
{
auto key = it.first;
std::visit([key](auto&& value) { visitor(key, value); }, it.second);
}
}
但我无法弄清楚细节(我尝试将 VisitAllValues()
写为模板,但后来我 运行 陷入了调用方的问题)。
如何实现我的 VisitAllValues()
方法,使其接受可以访问 ID 和值的访问者?
Here 是可以玩的完整玩具示例。
在我看来,如下应该可行
template <typename L>
void VisitAllValues (L const & visitor)
{
for (auto& it : States)
{
auto key = it.first;
std::visit([&](auto&& value) { visitor(key, value); }, it.second);
}
}
题外话:也许使用 std::forward
是你使用转发引用
visitor(key, std::forward<decltype(value)>(value));
我正在尝试实现一个状态存储,它基本上是一个键值对映射,其中值为 std::variant
。
以下 class 工作正常。请注意,它不仅打印访问值,还打印键:
class StateStoreTest
{
typedef std::variant<float, std::string> StateValue;
private:
std::map<int, StateValue> States;
public:
void SetValue(int key, const StateValue& value) { States[key] = value; }
void VisitAllValues()
{
for (auto& it : States)
{
auto key = it.first;
std::visit([key](auto&& value) { std::cout << key << "=" << value << "\n"; }, it.second);
}
}
};
我可以这样使用它并且输出符合预期:
StateStoreTest sst;
sst.SetValue(1, 123.4f);
sst.SetValue(2, "Test");
sst.VisitAllValues();
现在我不想在 VisitAllValues()
中实现特定的访问者实现,但我希望能够提供可调用 VisitAllValues()
方法的访问者。在那个可调用的访问者中,我想访问键和访问值。
所以基本上从呼叫者的角度来看,我希望能够做这样的事情:
sst.VisitAllValues([](auto key, auto&& value){ std::cout << key << "=" << value << "\n"; });
我想我的 VisitAllValues()
方法应该是这样的:
void VisitAllValues(??? visitor)
{
for (auto& it : States)
{
auto key = it.first;
std::visit([key](auto&& value) { visitor(key, value); }, it.second);
}
}
但我无法弄清楚细节(我尝试将 VisitAllValues()
写为模板,但后来我 运行 陷入了调用方的问题)。
如何实现我的 VisitAllValues()
方法,使其接受可以访问 ID 和值的访问者?
Here 是可以玩的完整玩具示例。
在我看来,如下应该可行
template <typename L>
void VisitAllValues (L const & visitor)
{
for (auto& it : States)
{
auto key = it.first;
std::visit([&](auto&& value) { visitor(key, value); }, it.second);
}
}
题外话:也许使用 std::forward
是你使用转发引用
visitor(key, std::forward<decltype(value)>(value));