【问题标题】:How to convert variant to string in C++如何在 C++ 中将变量转换为字符串
【发布时间】:2022-01-14 10:54:22
【问题描述】:

我是 C++ 新手,我想知道如何将变体转换为字符串:

variant<string, int, float> value;

if (!value.empty()) {
   // do something
}

【问题讨论】:

标签: c++ variant


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 检查该类型的对象是否包含在变体中。

    【讨论】:

    • 抱歉,我是 C++ 新手。 & after auto 做什么?
    • std::get 返回的值可以是(深度)副本 (auto T1),也可以是对变体持有的对象的引用 (auto&amp;)。在后一种情况下,如果它是可变的,则对局部变量 (myT) 的更改将反映在变体中。
    • 谢谢你的解释!
    • error: 'const' qualifier may not be applied to a reference。 East const 让你失望了。
    • @HolyBlackCat :D
    【解决方案3】:

    好吧,您将需要针对不同情况的自定义代码... 以下功能可以随心所欲:

    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);
    }
    

    【讨论】:

      【解决方案4】:

      您可以按索引或类型提取它,如果它不是当前活动的索引或类型,两者都会抛出异常

      // 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);
      

      【讨论】:

      • 如果您两次使用相同的类型,按索引搜索特别有用,这是允许的
      【解决方案5】:

      您可以使用std::holds_alternative方法检查该值是否为字符串,然后std::get检索它:

      if (std::holds_alternative<std::string>(value)) {
          std::cout << std::get<std::string>(value);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 2012-04-21
        • 2011-03-24
        • 1970-01-01
        • 2015-10-25
        • 2016-09-15
        • 1970-01-01
        相关资源
        最近更新 更多