Вы можете внести изменения в дизайн.Можно было бы сделать тип возвращаемого значения отдельным параметром шаблона:
template<class R, class Input, class Output, class Index>
size_t pack(R (*copy)(Input, Input, Output),
size_t N, Input input, Output output,
const Index &index);
Тип возвращаемого значения выводится (и впоследствии игнорируется вашим кодом). Другой вариант, который я бы порекомендовал, состоял бы в том, чтобы принять любой общийТип функции:
template<class CopyFunc, class Input, class Output, class Index>
size_t pack(CopyFunc func,
size_t N, Input input, Output output,
const Index &index);
Это не требует какой-либо конкретной подписи и обеспечивает большую гибкость.