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_visitortemplate 来获得类似的结果。我怎样才能实现我的目标?

【问题讨论】:

变体持有的替代方案是运行时属性。 variant&lt;A, B&gt; + variant&lt;C, D&gt;应该有什么类型? 根据用户指定输入的方式,变体将保留其中一个。我将更新问题以反映这一点。 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 - 在变体上应用算术的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

Boost::variant 与引用相同变体的对象

(C++, boost::variant) boost 变体映射的数据类型并对其执行数学运算

boost::variant 单一存储保证

强大的 boost::variant 序列化

boost::variant 将 static_visitor 应用于某些类型

boost 变体对常用方法的简单调用