Итак, вы должны выбрать между синглтоном и кучей свободных функций в пространстве имен, с некоторым выделенным глобальным состоянием в любом случае?
Во-первых, зачем вам нужен синглтон?
Если это просто для того, чтобы они разделяли состояние, рассмотрите возможность извлечения его в TU-внутренние переменные на уровне пространства имен, и сделайте все функции, которые вам нужны, статическими. Нет необходимости возиться с синглтонами, которые плохо воспринимаются из-за вопиющего чрезмерного и неправильного использования, не считая неправильной реализации.
Далее, зачем вообще нужен класс?
Это не Java, вы можете иметь свободные функции и глобальное состояние вне классов, совершенно скрытые от посторонних глаз, если только не запрашивается внешняя связь. Преимущество этого способа - более легкая расширяемость, и если вам не нужно предоставлять специфический интерфейс (для статической инъекции с шаблонами или динамической инъекции с наследованием), то недостатков нет.
На самом деле это предпочтительный способ, нет причин поступать иначе.
Прикрепляю к посту несколько видео по теме: