如何简化升压变量上的加号动作? [英] How to simplify the plus action on boost variant?
本文介绍了如何简化升压变量上的加号动作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有boost变体类型定义:
I have boost variant type definition:
typedef boost::variant< bool, int, float, double> VariantType;
我想对其执行加/减/乘/除操作.以添加类为例.问题是,如果将新类型添加到 VariantType 中,例如std :: string,则Add类必须用新类型更新.
I want to implement add/subtract/multiply/divide action on it. Take Add class for example. The problem is if adding a new type into VariantType, such as std::string, The Add class must be updated with the new type.
struct Add : public boost::static_visitor<VariantType> {
template <typename T>
T operator() (T a, T b) const {
return a + b;
}
float operator() (int a, float b) const {
return a + b;
}
float operator() (float a, int b) const {
return a + b;
}
double operator() (int a, double b) const {
return a + b;
}
double operator() (double a, int b) const {
return a + b;
}
double operator() (float a, double b) const {
return a + b;
}
double operator() (double a, float b) const {
return a + b;
}
VariantType operator() (bool a, int b) const {
throw std::invalid_argument("bool and int can't Plus");
}
VariantType operator() (bool a, float b) const {
throw std::invalid_argument("bool and float can't Plus");
}
VariantType operator() (bool a, double b) const {
throw std::invalid_argument("bool and double can't Plus");
}
VariantType operator() (int a, bool b) const {
throw std::invalid_argument("int and bool can't Plus");
}
VariantType operator() (float a, bool b) const {
throw std::invalid_argument("float and bool can't Plus");
}
VariantType operator() (double a, bool b) const {
throw std::invalid_argument("double and bool can't Plus");
}
};
用法:
VariantType v1 = 1;
VariantType v2 = 2.1;
VariantType v3 = boost::apply_visitor(Add(), v1, v2);
cout<<boost::get<double>(v3)<<endl; //Print 2.2
GCC版本为4.8.2;增强版为1.57.0;如何简单地添加类?谢谢.
The GCC version is 4.8.2; The boost version is 1.57.0; How to simply the Add class? Thanks.
推荐答案
只需使其成为多态函子即可:
Just make it a polymorphic functor:
#include <boost/variant.hpp>
#include <iostream>
using VariantType = boost::variant<int, float, double, bool>;
struct Add : public boost::static_visitor<VariantType> {
template <typename T, typename U>
auto operator() (T a, U b) const -> decltype(a+b) { return a + b; }
template <typename T> VariantType operator()(bool, T) const { throw std::invalid_argument("Can't to bool"); }
template <typename T> VariantType operator()(T, bool) const { throw std::invalid_argument("Can't add bool"); }
VariantType operator()(bool,bool) const { throw std::invalid_argument("Can't add bools"); }
};
int main() {
std::cout << std::boolalpha;
VariantType specimens[] = { int(42), 3.14f, 3.14, true };
for (auto lhs : specimens)
for (auto rhs : specimens)
{
try {
std::cout << lhs << " + " << rhs << " == " << boost::apply_visitor(Add{}, lhs, rhs) << "\n";
} catch(std::exception const& e) {
std::cout << lhs << " + " << rhs << " ==> " << e.what() << "\n";
}
}
}
打印:
42 + 42 == 84
42 + 3.14 == 45.14
42 + 3.14 == 45.14
42 + true ==> Can't add bool
3.14 + 42 == 45.14
3.14 + 3.14 == 6.28
3.14 + 3.14 == 6.28
3.14 + true ==> Can't add bool
3.14 + 42 == 45.14
3.14 + 3.14 == 6.28
3.14 + 3.14 == 6.28
3.14 + true ==> Can't add bool
true + 42 ==> Can't to bool
true + 3.14 ==> Can't to bool
true + 3.14 ==> Can't to bool
true + true ==> Can't add bools
这篇关于如何简化升压变量上的加号动作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文