boost::variant - 在变体上应用算术的最简单方法
Posted
技术标签:
【中文标题】boost::variant - 在变体上应用算术的最简单方法【英文标题】:boost::variant - simplest way to apply arithmetic on variants 【发布时间】:2019-12-22 13:41:26 【问题描述】:最近我一直在尝试boost::variant
。我正在尝试将算术应用于<int, float>
类型的两个变体对象:
typedef boost::variant<int, float> VariableValue;
VariableValue var1 = 2;
VariableValue var2 = 5;
VariableValue var3 = var1 + var2;
std::cout << "Result: " << var3 << std::endl; //expected 7
这应该适用于变体的任一替代方案,例如:
VariantValue var1 = 2;
VariantValue var2 = 1.234;
VariantValue var3 = var1 + var2;
std::cout << "Result: " << var3 << std::endl; //expected 3.234
但是这种方法行不通。我一直在研究这个问题,我看到人们使用boost::apply_visitor
和template
来获得类似的结果。我怎样才能实现我的目标?
【问题讨论】:
变体持有的替代方案是运行时属性。variant<A, B> + variant<C, D>
应该有什么类型?
根据用户指定输入的方式,变体将保留其中一个。我将更新问题以反映这一点。
var1 + var2
的类型应该在编译时知道。但是只有在运行时才知道变体的内容。编译器必须考虑所有可能的替代方案。在一般情况下,如果您想处理所有可能的组合,sum 变体将由 N^2
类型组成。访问者的返回类型不能取决于变体持有的替代方案。
看看this question。
【参考方案1】:
我从问题How to simplify the plus action on boost variant? 中找到了解决方案,并出于我的目的对其进行了简化:
struct Add : public boost::static_visitor<VariableValue>
template <typename T, typename U>
auto operator() (T a, U b) const -> decltype(a + b)
return a + b;
;
添加:
VariantValue var1 = 2;
VariantValue var2 = 1.234;
std::cout << "Result: " << boost::apply_visitor(Add, var1, var2) << std::endl;
输出 3.234
【讨论】:
以上是关于boost::variant - 在变体上应用算术的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章
(C++, boost::variant) boost 变体映射的数据类型并对其执行数学运算