我的程序中有一个boost :: variant,我想检查变量本身是否已初始化,以及其中一个类型中是否包含值。
我在变种上尝试过empty(),但这似乎不起作用。也没有检查NULL。
有人知道如何检查吗?
编辑:好的,它似乎永远不会是空的,但它的包含类型并不总是有值,所以如何检查无值情况?
答案 0 :(得分:35)
如果您看到my question regarding never empty guarantee and single storage,boost::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}}”部分。)