#ifndef CGAL_OVERLOAD_H #define CGAL_OVERLOAD_H #include #if !defined(CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES) && !defined(CGAL_CFG_NO_CPP0X_TUPLE) && !defined(CGAL_CFG_NO_CPP0X_RVALUE_REFERENCE) #include namespace CGAL { template struct Overload_helper : public Overload_helper { typedef typename std::tuple_element::type inner_type; typename inner_type::result_type operator()(typename inner_type::argument_type x) { return std::get(static_cast(this)->t)(x); } using Overload_helper::operator(); }; template struct Overload_helper { typedef typename std::tuple_element<0 ,T>::type inner_type; typename inner_type::result_type operator()(typename inner_type::argument_type x) { return std::get<0>(static_cast(this)->t)(x); } }; template struct Overload : public Overload_helper, std::tuple_size >::value, Overload > { typedef std::tuple Tuple_type; typedef typename std::tuple_element<0, Tuple_type>::type::result_type result_type; Tuple_type t; Overload(Args&&... args) : t(std::forward(args)...) {} explicit Overload(const Tuple_type& t) : t(t) {} Overload(Tuple_type&& t) : t(t) {} }; template Overload make_overload(Args&&... args) { return Overload{ std::forward_as_tuple(args...) }; } } // namespace CGAL #endif // !defined(CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES) && !defined(CGAL_CFG_NO_CPP0X_TUPLE) #endif /* CGAL_OVERLOAD_H */