簡體   English   中英

從 std::variant 獲取 substr <std::string, std::vector<std::string> &gt;&gt; 在 C++</std::string,>

[英]Getting a substr from a std::variant<std::string, std::vector<std::string>>> in C++

所以我有一個帶有字符串鍵和字符串或向量值的 map。 我想循環遍歷 map 中的所有字符串值(無論它們是在向量中找到還是可以直接檢查),並檢查它們是否與給定字符串匹配(與字符串是什么無關)。 如果該字符串完全或部分匹配,我會將找到該字符串的 map 放入向量中。

我遇到的問題是,即使我使用 if 條件將字符串與向量分開, substr function 認為我正在處理std::variant<std::string, std::vector<std::string>>>因此給了我一個錯誤。

else 函數中的 begin 函數也告訴我,由於這個原因,variant 沒有名為“begin”的成員。 我完全迷路了,任何幫助都會很棒。

for (std::unordered_map<std::string,
                        std::variant<std::string,
                        std::vector<std::string>>>::iterator h = MyMap.begin();
    h != MyMap.end();
    h++) {
    if (typeid(h->second) == typeid(std::string)) {
        std::string MapValueString = h->second.substr(0, TextCtrlValue.length());
        if (MapValueString == TextCtrlValue) {
            RightSearchResultsVector.insert(RightSearchResultsVector.end(), Maps.begin(), Maps.end());
        }
    }
    else {
        for (std::vector<std::string>::iterator f = h->second.begin(); f != h->second.end(); f++) {
            // Go through vector and find matching/semi matching strings
        }
    }
}

以下是如何判斷變體持有什么類型

std::string* pstr = std::get_if<std::string>(&h->second);
if (pstr != nullptr)
{
    // do stuff with string
}
else
{
    std::vector<std::string>& vec = std::get<std::vector<std::string>>(h->second);
    // do stuff with vector
}

順便說一句,你可以簡化這個怪物

for (std::unordered_map<std::string,
                    std::variant<std::string,
                    std::vector<std::string>>>::iterator h = MyMap.begin();

通過寫作

for (auto h = MyMap.begin();

明智地使用auto可以極大地提高代碼的可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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