Не очень элегантное решение с использованием SFINAE
template<typename FuncPtr, typename T,
bool = std::is_member_function_pointer<FuncPtr>::value>
struct bind_func
{
template<typename ... Args>
static auto bind(FuncPtr fPtr, T *pObj, Args &&... args)
{
return std::bind(fPtr, std::forward<Args>(args)...);
}
};
template<typename FuncPtr, typename T>
struct bind_func<FuncPtr, T, true>
{
template<typename ... Args>
static auto bind(FuncPtr fPtr, T *pObj, Args &&... args)
{
return std::bind(fPtr, pObj, std::forward<Args>(args)...);
}
};
template<typename FuncPtr, typename T, typename ... Args>
auto bind_func_v(FuncPtr funcPtr, T *pObj, Args &&... args)
{
return bind_func<FuncPtr, T>::bind(funcPtr,
pObj, std::forward<Args>(args)...);
}