检查boost :: variant <t>是否为null </t>

时间:2011-03-15 13:15:19

标签: c++ boost null variant

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

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

有人知道如何检查吗?

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

5 个答案:

答案 0 :(得分:35)

如果您看到my question regarding never empty guarantee and single storageboost::variant确实支持名为boost::blank的类似NIL的值类型。这将保证变体永远不会使用堆作为备份存储

您可以使用boost::variant<>::which()检测存储的类型,该 typedef boost::variant< boost::blank , int , std::string > var_t; var_t a; assert( a.which() == 0 ); a = 18; assert( a.which() == 1 ); 返回绑定变体类型的整数索引;因此,如果您使用空白作为第一种类型,那么()将在其空白时返回0

请参阅以下示例

{{1}}

希望这会有所帮助

答案 1 :(得分:17)

始终初始化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;
}

答案 2 :(得分:4)

确保您拥有定义明确的变体的一种方法是在变体列表中包含“NullType”。虽然它可能需要在“访问者”中编写更多代码,但您可以编写使用它,但是他们可以抛出异常以让操作员知道某些东西是不对的。我通常反对这样的运行时检查,但有时,实际上没有任何其他方法。我只想说:

class NullType{};

然后将其添加为变体列表的第一个参数。正如其他人所说的那样,增强文档描述了你永远不会遇到变量为空的情况。但是,您可以进行类型检查,以确保如果不重载函数或者如果您有“NullType”则抛出运行时异常,则无法使用“NullType”进行编译。

现在你的变种:

boost::variant<NullType, int, double, long double> number;

class DoSomething : boost:static_visitor<void>{
public:
    void visit(const int& _item);
    void visit(const double& _item);
    void visit(const long double& _item);
    void visit(const NullType& _uhOh);
};

答案 3 :(得分:3)

Boost.Variant有never-empty guarantee,这意味着它必须始终存储一些值。它的empty成员保证始终返回false并且只是为了兼容而存在。

您可能想要查看Boost.Any

答案 4 :(得分:0)

你也可以使用 boost::variant<boost::blank, int, double, long double> number;

变体函数empty()。如果variant始终只包含其有界类型之一,则返回false。 (有关详细信息,请参阅“{3}}”部分。)