在 boost::variant的原理及基本用法 ,我们知道想要获取variant
类型变量的内容,主要有apply_visitor
和get<T>
两种方法,而get<T>
的一个显著的缺陷即是,当variant
类型变量以参数的形式传递给某一函数时,我们需要判断其可能的类型:
void times_two(boost::variant<int, std::string>& v)
{
if (int& a = boost::get<int>(v))
a *= 2;
if (std::string& s = boost::get<std::string>(v))
s += s;
// 第二个 if 判断编译出错,
// “表达式必须包含 bool 类型(或可转换为 bool)”
}
根据 语句乎?表达式乎?(Python/C) ,我们知赋值表达式具有右结合返回左值的特性,错误提示意味着string
对象无法转换为bool
:
std::string s("hello");
if (s)
// “表达式必须包含 bool 类型(或可转换为 bool)”
所以一种简单的改进即是:
std::string s("hello");
if (&s)
void times_two(boost::variant<int, std::string>& v)
{
if (int& a = boost::get<int>(v))
a *= 2;
if (std::string* s = boost::get<std::string>(&v))
*s += *s;
}