Datatype visitor lambda approach
As we discussed Expression visitor we created a prototype for datatype opeation handling:
struct Partial_any {
std::function<T(const Expression::Impl::Float_literal& impl)> impl_float;
std::function<T(const Expression::Impl::Long_literal& impl)> impl_long;
...
}
template<class T>
struct PDI_NO_EXPORT Expression::Impl::Any_value : public Expression::Impl::Value {
T m_value;
std::function<T(const Expression::Impl::Float_literal& impl)> m_float_literal_func;
// ...
public:
Any_value(std::function<T(const Expression::Impl::Float_literal& impl)> impl);
// ...
template<class ... L>
static Any_value make_visitor(Partial_any pa, std::function<T(const Expression::Impl::Float_literal& impl)> impl_func, L others...); // L can be std::function<T(const Expression::Impl::Float_literal& impl)>
{
pa.add(impl_func);
return make_visitor(pa, others...);
}
template<class ... L>
static Any_value make_visitor(std::function<T(const Expression::Impl::Long_literal& impl)> impl_func, L others...); // L can be std::function<T(const Expression::Impl::Float_literal& impl)>
void visit(const Expression::Impl::Float_literal& impl) override;
void visit(const Expression::Impl::Int_literal& impl) override;
void visit(const Expression::Impl::Operation& impl) override;
void visit(const Expression::Impl::Reference_expression& impl) override;
std::string visitor_name() const override;
T value() const;
};