This C++11 library allows to bind different callable
into a single holder without any run-time overhead.
int add(int a, int b) { return a+b; }
double mul(double a, double b){ return a*b; }
auto func = overloaded::make(add, mul);
std::assert(func(2, 2) == 4);
std::assert(func(2.2, 2.2) == 4.84);
For the following example:
/***************************************************************************/
__attribute__ ((noinline))
int f2(const int &v) {return v*2;}
__attribute__ ((noinline))
int f3(int &v) {v = v*2; return v;}
/***************************************************************************/
int main(int argc, char **) {
int res = 0;
auto *fp = &f2;
auto overloaded = overloaded::make(fp, f3);
res += overloaded(argc); // f3()
res += overloaded(static_cast<const int &>(argc)); // f2()
return res;
}
/***************************************************************************/
the following ASM will be generated:
f2(int const&):
mov eax, DWORD PTR [rdi]
add eax, eax
ret
f3(int&):
mov eax, DWORD PTR [rdi]
add eax, eax
mov DWORD PTR [rdi], eax
ret
main:
sub rsp, 8
mov DWORD PTR [rsp+4], edi
lea rdi, [rsp+4]
call f2(int const&)
mov edx, eax
call f3(int&)
add rsp, 8
add eax, edx
ret
As you can see, there is nothing superfluous here!