This looks like a problem for overload sets. Written in C++1y as it saves a decltype
#define OVERLOAD_SET(F) struct {\
template<typename...Args> auto operator()(Args&&...args)const{\
return (F)(std::forward<Args>(args)...);\
}\
}
now we can
static OVERLOAD_SET(std::stoll) os_stroll;
and os_stroll
can be passed to std::function
and it just does the right thing.
You can even enable ADL if you like:
#define ADL_OVERLOAD_SET(NS, F) struct {\
template<typename...Args> auto operator()(Args&&...args)const{\
using NS::F;
return F(std::forward<Args>(args)...);\
}\
}
Another optional improvement:
/* cast to function pointer. Copy paste for each calling convention */\
template<typename R, typename Args...>\
operator R(*)(Args...)() const {\
return [](Args...args){return (F)(std::forward<Args>(args)...);};\
}\
or be a bit more strict about what Args...
to accept (the above will return a function pointer iff the types convert. It should also probably do SFINAE to generate earlier failure).