簡體   English   中英

訪問列表中的所有 std::variants 並為每次訪問捕獲一個附加值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM