Re: Передать группу перегруженных функций
От: vic.scherba  
Дата: 19.09.14 23:35
Оценка: 9 (1)
Здравствуйте, 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 при необходимости можно объявить не шаблонной.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.