簡體   English   中英

如何使用 std::variant 打印 map 鍵/值?

[英]How can I print map key/value with std::variant?

我正在嘗試在我的字典中打印某個值的鍵。 我這樣定義了我的 map:

std::map<std::string, std::variant<float,int,bool,std::string>> kwargs; 
kwargs["interface"] = "probe"; 
kwargs["flag"] = true; 
kwargs["Height"] = 5; 
kwargs["length"] = 6; 

我嘗試正常打印該值,但出現(沒有運算符“<<”與這些操作數匹配)錯誤。

std::cout << kwargs["flag"] << std::endl; 

有人可以幫我解決這個錯誤嗎?

std::variant沒有operator<< ,不能直接打印出來。 您需要從變體中讀取值(按索引或類型),例如

std::cout << std::get<bool>(kwargs["flag"]) << std::endl; 

或者

std::cout << std::get<2>(kwargs["flag"]) << std::endl; 

您可以為您的類型定義operator<<

std::ostream& operator<<(std::ostream& os, std::variant<float,int,bool,std::string> const& v) {
    std::visit([&os](auto const& x) { os << x; }, v);
    return os;
}

您可以推廣解決方案以使用任何variant專業化:

template <class Var, class = std::variant_alternative_t<0, Var>>
std::ostream& operator<<(std::ostream& os, Var const& v) {
    std::visit([&os](auto const& x) { os << x; }, v);
    return os;
}

注意,如果Var不是std::variant特化,則存在第二個模板參數以禁用定義。

我會將std::visit與通用 lambda 一起使用,它將任何類型打印到std::cout ,如下所示:

std::map<std::string, std::variant<float,int,bool,std::string>> kwargs; 
kwargs["interface"] = "probe"s;
kwargs["flag"] = true; 
kwargs["Height"] = 5; 
kwargs["length"] = 6; 

for (const auto& [k, v] : kwargs){
    std::cout << k << " : ";
    std::visit([](const auto& x){ std::cout << x; }, v);
    std::cout << '\n';
}

這是因為所有的floatintboolstd::string都有 output stream 運算符<<的重載。 對於其他類型,或覆蓋此行為,您可以使用自定義函子 class 而不是 lambda:

struct PrintVisitor {
    template<typename T>
    void operator()(const T& t) const {
        std::cout << t;
    }

    // prints std::string in quotes
    void operator(const std::string& s) const {
        std::cout << '\"' << s << '\"';
    }
};

[...]

std::visit(PrintVisitor{}, kwargs);

注意:不幸的是,行kwargs["interface"] = "probe"; 實際上 select 不是變體類型的std::string構造函數,因為字符串文字優先轉換為bool而不是std::string進一步閱讀)。 您可以通過使用例如std::string{"probe"}或標准std::string用戶定義文字顯式創建std::string來避免這種情況,如"probe"s

現場演示

暫無
暫無

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

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