【发布时间】:2021-12-12 17:26:33
【问题描述】:
我想在boost::blank 的帮助下将空值添加到int 和double。稍后,我想检查这些值是否为空。我很难找到有关boost::blank 功能的信息。有人可以提供一些如何使用boost::blank 的示例吗?
【问题讨论】:
我想在boost::blank 的帮助下将空值添加到int 和double。稍后,我想检查这些值是否为空。我很难找到有关boost::blank 功能的信息。有人可以提供一些如何使用boost::blank 的示例吗?
【问题讨论】:
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<int> (std::optional<double>)
您可以像这样使用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"
如果boost::blank 确实是您要找的,让我们重新审视std::variant<blank, int, double> 场景。
构造一个“空”变体:
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";
variant【讨论】:
boost::blank 用于您想要的任何其他内容;这是一个如此简单的类,它实际上只是为了方便而存在。如果它是您对boost 的唯一依赖,那么与其自己编写它可能不值得。