如何在 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);
}

Demo