【问题标题】:How to use boost::blank如何使用 boost::blank
【发布时间】:2021-12-12 17:26:33
【问题描述】:

我想在boost::blank 的帮助下将空值添加到int 和double。稍后,我想检查这些值是否为空。我很难找到有关boost::blank 功能的信息。有人可以提供一些如何使用boost::blank 的示例吗?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    boost::blank 不是您想要的。

    boost::blank 是这样的:

    struct blank
    {
    };
    
    // overloaded operators
    // ...
    

    如果您正在创建 std::variant(或 boost::variant)并想要像这样的“空变体”,这可能会很有用:

    std::variant<boost::blank, int, double, char> my_variant;
    

    如果您想单独为 int 或 double 添加“空”值,则应使用 std::optional&lt;int&gt; (std::optional&lt;double&gt;)

    您可以像这样使用std::optional 检查空值:

    std::optional<int> value;
    std::cout << std::boolalpha << value.has_value() << std::endl; // "false"
    

    它也可以隐式转换为bool,因此您可以像这样检查if 中的值:

    if (value)
        std::cout << "Has a value: " << *value << std::endl; // branch not taken
    

    最后,如果没有值,您可以要求使用默认值,如下所示:

    std::cout << value.value_or(0) << std::endl; // "0"
    

    Live Demo


    如果boost::blank 确实是您要找的,让我们重新审视std::variant&lt;blank, int, double&gt; 场景。

    构造一个“空”变体:

    std::variant<boost::blank, int, double> my_variant;
    

    或等价的,

    std::variant<blank, int, double> my_variant = boost::blank{};
    

    接下来,为每种类型定义访问者:

    struct my_visitor
    {
        void operator()(boost::blank) const
        {
            std::cout << "Variant is empty\n";
        }
        void operator()(int i) const
        {
            std::cout << "Variant has int with value " << i << std::endl;
        }
        void operator()(double d) const
        {
            std::cout << "Variant has double with value " << d << std::endl;
        }
    };
    

    我们可以使用std::visit执行相应的功能:

    // int
    my_variant = 42;
    std::visit(visitor, my_variant);
    
    // double
    my_variant = 1337.0;
    std::visit(visitor, my_variant);
    
    // reset to empty
    my_variant = boost::blank{};
    std::visit(visitor, my_variant);
    

    您还可以通过调用holds_alternative 来检查“空”variant:

    if (std::holds_alternative<blank>(my_variant))
        std::cout << "Variant is empty\n";
    

    Demo with variant

    【讨论】:

    • 非常感谢,我需要变体之一,但我没有注意到空白属于变体。
    • @Meng:“属于”有点强。它更像是“变体是空白的明显应用”。您可以将boost::blank 用于您想要的任何其他内容;这是一个如此简单的类,它实际上只是为了方便而存在。如果它是您对boost 的唯一依赖,那么与其自己编写它可能不值得。
    猜你喜欢
    • 2020-12-13
    • 2010-12-11
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2012-11-04
    • 2011-02-04
    • 2011-04-28
    相关资源
    最近更新 更多