SFINAE не смотрит на тело функции, учитывается только ее объявление.
Это означает, что когда мы говорим о разрешении перегрузки, ваш класс выглядит следующим образом:
class Worker
{
template<typename A, typename B, typename... Cs>
void QueueFunction(A a, B b, Cs... cs)
{}
template<typename A, typename Bs>
void QueueFunction(A a, Bs... bs)
{}
};
Принимая это во внимание, вполне логично, что w.QueueFunction(&sub,5,6);
сильнее привязывается к первому.
Редактировать: То, что вы делаете, это в основном переизобретение std::bind
,так что вы могли бы использовать его вместо этого.Он будет обрабатывать функторы, функции-члены и все остальное одновременно.
template<typename... Args>
void QueueFunction(Args&&... args) {
funcs.emplace_back(std::bind(std::forward<Args>(args)...));
}