我正在尝试在字典中打印某个值的键。我这样定义地图:
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::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';
}
这工作,因为所有的float
,int
,bool
,以及std::string
对输出流运算符重载<<
。对于其他类型,或者要覆盖此行为,可以使用自定义仿函数类而不是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";
实际上并未选择std::string
变量类型的构造函数,因为字符串文字优先转换为abool
而不是a std::string
(进一步阅读)。您可以通过std::string
例如使用std::string{"probe"}
或标准的std::string
用户定义文字来明确避免这种情况"probe"s
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句