
Have you looked at boost::variant<>? You would need to make a few code changes: typedef boost::variant<double, long, int, float> ParamValue; After doing this, you no longer need a BaseParamValue or any inheritance at all for that matter. class Param { public: Param() : mParamValue(0) {} Param(const string& type) : mParamValue(create_param(type)) { } private: ParamValue create_param(const string& type) { if (type == "LONG") return ParamValue(0L); else if (type == "DOUBLE") return ParamValue(0.0); //etc } ParamValue mParamValue; }; class TestVisit : public boost::static_visitor<> { void operator()(double d) const { } void operator()(long l) const { } void operator(float f) const { } }; class TestVisitReturn : public boost::static_visitor<bool> { bool operator()(double d) const { return true; } bool operator()(long l) const { return true; } bool operator(float f) const { return true; } }; Alternatively, you could templatize the operator() to accept any of the types. int main(int argc, char** argv) { ParamValue value("LONG"); boost::apply_visitor(TestVisit(), value); bool result = boost::apply_visitor(TestVisitReturn(), value); }