检查boost :: variant <T>是否为null

Ton*_*ion 18 c++ null boost variant

我的程序中有一个boost :: variant,我想检查变量本身是否已初始化,以及其中一个类型中是否包含值.

我在变种上尝试过empty(),但这似乎不起作用.也没有检查NULL.

有人知道怎么检查吗?

编辑:好的,它似乎永远不会是空的,但它的包含类型并不总是有值,所以如何检查无值情况?

lur*_*her 35

如果你看到我关于永不空保证和单个存储的问题,boost::variant那么支持一个类似NIL的值类型boost::blank.这将保证变体永远不会使用堆作为备份存储

您可以检测存储的类型,使用哪种类型boost::variant<>::which()返回绑定变量类型的整数索引; 所以如果你使用空白作为第一种类型,那么()将在其空白时返回0

请参阅以下示例

 typedef boost::variant< boost::blank , int , std::string > var_t;
 var_t a;
 assert( a.which() == 0 );
 a = 18;
 assert( a.which() == 1 );
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 哦,很好,我不知道`boost :: blank`. (2认同)

Mat*_* M. 18

A boost::variant始终初始化.

如果您没有明确地将其初始化,则使用其默认构造函数构造第一个项目:

struct Foo {};
struct Bar {};

struct Visitor: boost::static_visitor<>
{
  void operator()(Foo const& foo) const { std::cout << "Foo\n"; }
  void operator()(Bar const& bar) const { std::cout << "Bar\n"; }
};

int main(int argc, char* argv[])
{
  boost::variant<Foo,Bar> var;
  boost::apply_visitor(Visitor(), var); // prints Foo
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 附录:显然,这与`boost :: optional`不同. (3认同)