[英]Visit all std::variants in a list and capture an additional value for every visit
我正在嘗試實現 state 存儲,它基本上是鍵值對的 map ,其中值為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);
}
}
};
我可以這樣使用它,並且 output 符合預期:
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 和 value 的訪問者?
這是完整的工作玩具示例。
在我看來,如下應該有效
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.