- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
template<typename F, typename... Fns>
struct Overloaded
{
std::tuple<F,Fns...> fns;
// эта и следующая за ней функция нужны для рекурсивного
// накопления кортежа из всех входящих функций
template<typename First, typename... Others>
std::tuple<First,Others...> collect(First f, Others... others) {
auto t = std::make_tuple(f);
return std::tuple_cat(t, collect(others...));
}
template<typename Single>
std::tuple<Single> collect(Single f) {
return std::make_tuple(f);
}
Overloaded(F f, Fns... others) {
// сохраняем кортеж функций
fns = collect(f, others...);
}
};
template<typename F, typename... Fns>
Overloaded<F,Fns...> make_overloaded(F f, Fns... fns) {
return Overloaded<F,Fns...>(f,fns...);
}
//...
void F1(int) {}
void F2(int, float) {}
// ...
auto f = make_overloaded(F1, F2);
operator() можно нагенерировать boost.preprocessor и вытащить с помощью ключа -E gcc.
fxd.