В C ++ вы не можете выполнять частичную специализацию шаблонов для функций, только для структур и классов. Поэтому вам следует либо выполнить полную специализацию, либо использовать классы со статическими функциями-членами (конечно, это не то же самое, что функции)
Вы можете использовать некоторые приемы, используя классы:
template<typename Retval, typename Op, typename... Args>
struct my_traits {
static Retval call_retval_wrapper(CallContext &callctx, Op const op, Args &...args);
};
template<typename Op, typename ...Args>
struct my_traits<bool,Op,Args...> {
static bool call_retval_wrapper<bool, Op, Args>(
CallContext &callctx, Op const op, Args &...args) {
(callctx.*op)(args...);
return true;
}
};
template<typename Retval, typename Op, typename... Args>
Retval call_retval_wrapper(CallContext &callctx, Op const op, Args &...args)
{
return my_traits<Retval,Op,Args...>::call_retval_wrapper(calllxtx,op,args...);
}
Нечто подобное