【发布时间】:2019-01-04 03:34:23
【问题描述】:
我们在生产代码中广泛使用 boost::variant 的集合。 我们从这个集合中提取值的方式是
for (auto & var : vars)
{
switch (var.which())
{
case 1 :
AVal = boost::get<A>(var);
break;
case 2 :
BVal = boost::get<B> (var);
...
}
}
阅读有关变体的更多信息,我可以看到另一种选择
for (auto & var : vars)
{
switch (var.which())
{
case 1 :
AVal = boost::apply_visitor(AVisitor, var);
break;
case 2 :
BVal = boost::apply_visitor(BVisitor, var);
...
}
}
忽略 apply_visitor 提供编译时类型安全值访问并且功能更强大的事实,我是否应该期望上述任何一种方法在运行时性能方面有任何差异?
【问题讨论】:
-
这两个对我来说都是代码味道。您没有在访问者中进行工作是否有原因?
-
当你说“不在访问者内部做工作”是什么意思?这只是一个虚拟示例,在实际情况下,如果您的意思是这样,A/BVisitor 类将有适当的实现......
-
不要为不懂的东西写伪代码。我看不出有什么好的理由在访问之前进行切换; 访问是一种切换操作。到我将您的伪代码翻译成不是废话的代码时,它与您在真实代码中所做的事情几乎没有共同之处,除非非常幸运。 minimal reproducible example 请。
标签: c++ boost boost-variant