Скрытие бесплатных функций

Допустим, у меня есть несколько бесплатных функций в определенном пространстве имен, которые охватываются юнит-тестами. И скажем, я вижу некоторые общие функции, которые можно перенести в отдельную бесплатную функцию. Что я могу сделать, чтобы эта новая функция стала скрытой? Другими словами, эта функция должна использоваться только вышеупомянутыми свободными функциями, а не где-либо еще. Должен ли я добавить его в пространство имен в пространстве имен свободных функций. Если так, то как мне назвать пространство имен — есть ли соглашение об именах?

Я должен также отметить, что эта новая функция не тестируется модулем, поскольку она используется внутри других функций, которые тестируются модулем. Возможно, я ленивый, и решение этого вопроса состоит в том, что я просто тестирую эту функцию, а затем люди могут использовать ее, если захотят.

2

Решение

Вы можете скрыть это: сделать это частной статической функцией-членом класса, а затем явно дружить с каждой из ваших встроенных функций. Реализация может быть встроенной или отключенной, контроль доступа все еще будет работать.

Если только ты не необходимость чтобы ограничить доступ, я бы следовал соглашению Boost и просто поместил бы его во вложенное пространство имен detail (или что-то подобное).
Это просто предназначено для документирования того, что это деталь реализации, а не стабильный публичный интерфейс (и, конечно, чтобы не загрязнять пространство имен).

Это также позволяет избежать явного перечисления каждой свободной функции как друга.

3

Другие решения

Вы можете использовать вспомогательную функцию в качестве статической функции в закрытом разделе класса, а затем использовать только те функции, которым разрешено ее использовать.

class Foo
{
static int helper() {return 0;}
friend void baz();
};

void baz()
{
Foo::helper(); //compiles
}

void buz()
{
Foo::helper(); //doesn't compile
}
1