Я бы использовал объектный подход - он кажется немного более стандартным и похожим на способ передачи функторов в алгоритмы STL - его также проще расширять, позволяя параметрам, передаваемым в конструктор помощника, влиять на результаты операций и т. д. Разницы нет, но объектный подход, вероятно, будет более гибким в долгосрочной перспективе и более синхронизированным с аналогичными решениями, которые вы найдете в других местах.
Почему объект более гибкий? Одним из примеров является то, что вы можете легко реализовать более сложные операции (например, усреднение в этом примере), которые требуют, чтобы вы хранили временный результат «где-то» и требовали анализа результатов от нескольких вызовов, сохраняя при этом ту же «парадигму» использования. Во-вторых, возможно, вы захотите провести некоторую оптимизацию - скажем, вам нужен временный массив, чтобы что-то делать в этих функциях - зачем выделять его каждый раз или иметь статический класс в вашем классе и оставлять зависание и тратить память, когда вы можете выделить его, когда действительно необходимо повторно использовать несколько элементов, но затем отпустить, когда все операции выполнены и вызывается деструктор объекта.
Использование статических функций не дает никаких преимуществ - и, как видно из вышеизложенного, использование объектов имеет по крайней мере несколько преимуществ, поэтому выбор довольно прост. Imho.
Также семантика вызова может быть практически идентична - Assistant (). Sum (A, B) вместо Assistant :: sum (A, B) - действительно мало причин НЕ использовать объектный подход:)