如何在 C++ 中将变体转换为字符串
How to convert variant to string in C++
我是 C++ 新手,我想知道如何将变体转换为字符串:
variant<string, int, float> value;
if (!value.empty()) {
// do something
}
您可以使用std::holds_alternative
方法检查该值是否为字符串,然后std::get
检索它:
if (std::holds_alternative<std::string>(value)) {
std::cout << std::get<std::string>(value);
}
从std::variant
中提取T
类型的对象:
std::variant<T, T1, T2> myVariant;
try
{
auto& myT = std::get<T>(myVariant);
}
catch (std::bad_variant_access const& ex)
{
...
}
仅当您尝试获取变体中不存在的类型时才需要 try-catch
。或者,您可以使用 std::holds_alternative
.
检查变体中是否包含该类型的对象
您可以按索引或按类型提取它,如果它不是当前活动的索引或类型,两者都会抛出异常
// by index
auto& str = std::get<0>(value);
// by type
auto& str = std::get<string>(value);
要检查变体是否包含字符串,您可以按索引或类型检查
// by index
bool is_str = value.index() == 0;
// by value
bool is_str = std::holds_alternative<string>(value);
好吧,您将需要针对不同情况的自定义代码...
以下函数将按照您的意愿执行:
string stringify(variant<string, int, float> const& value) {
if(int const* pval = std::get_if<int>(&value))
return to_string(*pval);
if(float const* pval = std::get_if<float>(&value))
return to_string(*pval);
return get<string>(value);
}
std::visit
是使用 std::variant
的首选方式,您可以这样做:
std::string to_string(std::variant<std::string, int, float> var)
{
return std::visit([]<typename T>(const T& e){
if constexpr (std::is_same_v<T, std::string>) {
return e;
} else { // float/int
return std::to_string(e);
}
}, var);
}
我是 C++ 新手,我想知道如何将变体转换为字符串:
variant<string, int, float> value;
if (!value.empty()) {
// do something
}
您可以使用std::holds_alternative
方法检查该值是否为字符串,然后std::get
检索它:
if (std::holds_alternative<std::string>(value)) {
std::cout << std::get<std::string>(value);
}
从std::variant
中提取T
类型的对象:
std::variant<T, T1, T2> myVariant;
try
{
auto& myT = std::get<T>(myVariant);
}
catch (std::bad_variant_access const& ex)
{
...
}
仅当您尝试获取变体中不存在的类型时才需要 try-catch
。或者,您可以使用 std::holds_alternative
.
您可以按索引或按类型提取它,如果它不是当前活动的索引或类型,两者都会抛出异常
// by index
auto& str = std::get<0>(value);
// by type
auto& str = std::get<string>(value);
要检查变体是否包含字符串,您可以按索引或类型检查
// by index
bool is_str = value.index() == 0;
// by value
bool is_str = std::holds_alternative<string>(value);
好吧,您将需要针对不同情况的自定义代码... 以下函数将按照您的意愿执行:
string stringify(variant<string, int, float> const& value) {
if(int const* pval = std::get_if<int>(&value))
return to_string(*pval);
if(float const* pval = std::get_if<float>(&value))
return to_string(*pval);
return get<string>(value);
}
std::visit
是使用 std::variant
的首选方式,您可以这样做:
std::string to_string(std::variant<std::string, int, float> var)
{
return std::visit([]<typename T>(const T& e){
if constexpr (std::is_same_v<T, std::string>) {
return e;
} else { // float/int
return std::to_string(e);
}
}, var);
}