
On Sun, May 8, 2011 at 5:02 AM, Mathias Gaunard <mathias.gaunard@ens-lyon.org> wrote:
On 07/05/2011 18:00, Lorenzo Caminiti wrote:
Hello Mathias, I'm curious if you have an opinion about the usefulness of Boost.Local supporting multiple types (but not generic types) for its function parameters.
Probably not worth the effort, it seems that it would be a lot of work.
And you can still have overloading by doing it like this:
void BOOST_LOCAL_FUNCTION(const double& num, const bind& sep) std::cout << num << std::endl; BOOST_LOCAL_FUNCTION_NAME(l1)
void BOOST_LOCAL_FUNCTION(const std::string& num, const bind& sep) std::cout << num << std::endl; BOOST_LOCAL_FUNCTION_NAME(l2)
auto /* or the real type */ l = overload(l1, l2);
Does Boost already have a functor overloader like overload() above? If not, I can add something like overload<> below to Boost.Local: #include <boost/local/function.hpp> #include <boost/function.hpp> #include <vector> #include <algorithm> #include <iostream> #include <string> template<typename F0, typename F1, typename F2 = void, typename F3 = void> struct overload { }; template<typename F0R, typename F0A0, typename F1R, typename F1A0> struct overload<F0R (F0A0), F1R (F1A0)> { overload(boost::function<F0R (F0A0)> f0, boost::function<F1R (F1A0)> f1): f0_(f0), f1_(f1) {} F0R operator()(F0A0 a0) const { return f0_(a0); } F1R operator()(F1A0 a0) const { return f1_(a0); } private: boost::function<F0R (F0A0)> f0_; boost::function<F1R (F1A0)> f1_; }; // More specializations to overload also with F2, F3, etc. int main() { char sep = '\n'; void BOOST_LOCAL_FUNCTION_PARAMS(const double& num, const bind& sep) { std::cout << num << sep; } BOOST_LOCAL_FUNCTION_NAME(print_d) void BOOST_LOCAL_FUNCTION_PARAMS(const std::string& num, const bind& sep) { std::cout << num << sep; } BOOST_LOCAL_FUNCTION_NAME(print_s) overload<void (const double&), void (const std::string&)> print( print_d, print_s); std::vector<double> d(2); d[0] = 1.2; d[1] = 3.4; std::for_each(d.begin(), d.end(), print); std::vector<std::string> s(3); s[0] = "ab"; s[1] = "cd"; s[2] = "ef"; std::for_each(s.begin(), s.end(), print); return 0; } -- Lorenzo