Здравствуйте, igna, Вы писали:
I>Как "одним движением" зацепить и передать группу перегруженных функций в качестве фактического параметра?
I>То есть к примеру:
I>I>void f(int);
I>void f(char const*);
I>void g(int);
I>void g(char const*);
I>void h(generic_function const& gf)
I>{
I> gf(1);
I> gf("!");
I>}
I>int main()
I>{
I> h(make_generic_function(f));
I> h(make_generic_function(g));
I>}
I>
Без дополнительного runtime overhead с помощью одного из вспомогательных инструментов
моей библиотеки:
#include <mml/inline_overloaded_fn/make_inline_overloaded_fn.hpp>
template <typename F>
void h(F const& gf)
{
gf(1);
gf("!");
}
// это приходится делать из-за неоднозначности имен
void(*f_int)(int) = &f;
void(*f_char)(char const*) = &f;
h(mml::make_inline_overloaded_fn(f_int, f_char));
// если вместо одного перегруженного имени f задать функциям различные имена, например f1 и f2, то все упростится до:
// h(mml::make_inline_overloaded_fn(f1, f2));
f_int = &g;
f_char = &g;
h(mml::make_inline_overloaded_fn(f_int, f_char));
С некоторым runtime overhead с помощью
Boost.Functional/OverloadedFunction:
#include <boost/functional/overloaded_function.hpp>
template <typename F>
void h(F const& gf)
{
gf(1);
gf("!");
}
void(*f_int)(int) = &f;
void(*f_char)(char const*) = &f;
h(boost::make_overloaded_function(f_int, f_char));
f_int = &g;
f_char = &g;
h(boost::make_overloaded_function(f_int, f_char));
h при необходимости можно объявить не шаблонной.