devo spinta tipo di variante definizione:Come semplificare l'azione positiva sulla variante boost?
typedef boost::variant< bool, int, float, double> VariantType;
Voglio realizzare add/sottrazione/moltiplicazione/azione divide su di esso. Prendi Aggiungi classe per esempio. Il problema è se si aggiunge un nuovo tipo in VariantType, come std :: string, la classe Add deve essere aggiornata con il nuovo tipo.
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");
}
};
utilizzo:
VariantType v1 = 1;
VariantType v2 = 2.1;
VariantType v3 = boost::apply_visitor(Add(), v1, v2);
cout<<boost::get<double>(v3)<<endl; //Print 2.2
La versione GCC 4.8.2 è; La versione boost è 1.57.0; Come semplicemente aggiungere la classe? Grazie.
Ho appena aggiunto un esempio dal vivo con molte piccole correzioni/chiarimenti/cc @ DanielSchepler – sehe
Funziona. Grazie – liuzw