Я бы (как сказано выше) сделал шаблонный класс, сделал бы все функции статичными, а вспомогательную функцию частной. Но помимо этого я бы также рекомендовал сделать конструктор закрытым, как показано ниже:
template <typename T>
class Foo{
public:
static void func1(const T& value);
static void func2(const T& value);
private:
Foo();
static void helper(const T& value);
}
Когда вы делаете конструктор закрытым, компилятор не допускает экземпляры этого класса шаблона. Поэтому приведенный ниже код станет недопустимым:
#include "foo.h"
int main(){
int number = 0;
Foo<int>::func1(number); //allowed
Foo<int>::func2(number); //allowed
Foo<int>::helper(number); //not allowed, because it's private
Foo<int> foo_instance; //not allowed, because it's private
}
Так зачем кому-то этого хотеть? Потому что иметь разные экземпляры, которые ТОЧНО одинаковы, это то, чего вы, вероятно, никогда не захотите. Когда компилятор сообщает вам, что конструктор некоторого класса является закрытым, вы можете предположить, что иметь разные его экземпляры было бы ненужным.