Элегантный способ предотвратить отравление пространства имен в C ++

Давайте предположим,боб обернул свою библиотеку в пространство имен«Боб», а такжеАлиса собирается сделать все пространство имен видимым внутри ее собственной функции одним"используя пространство имен Боб", вместо"используя bob :: XYZ" для каждого элемента:

// This file is written by Alice:
#include <iostream>

// She uses Bobs library:
#include "bob.hpp"

int main(void) {
    // Import Bobs library and use it:
    using namespace bob;

    unsigned short value = 50000;
    bob::dump_as_signed(value);

    // Should not be possible without std:: prefix:
    cout << "foobar" << endl;
}

С другой стороны, Боб пытался предотвратить такие сценарииоборачивая реализацию в фиктивное пространство имен, и делаядоступны только эти символы, которые предназначены для других пользователей:

// This file is written by Bob
#include <iostream>
#include <type_traits>

// Namespace for public use:
namespace bob {

    // Implementation details:
    namespace impl_ {

        // Visible ONLY within sub-namespace:
        using std::cout;
        using std::endl;

        using std::is_integral;
        using std::make_signed;

        // No repeated std:: prefixes at all:
        template <typename T,
            typename S = typename make_signed<T>::type>
        void dump_as_signed(const T i) {
            static_assert(is_integral<T>::value, "no integer");

            // Do something very very useful:
            cout << "signed:" << static_cast<S>(i) << endl;
        }
    }

    // Make available without poisoning with std::*:
    using impl_::dump_as_signed;

}

Поскольку все директивы использования заключены в фиктивное пространство имен "impl_" в главном пространстве имен Бобса, Алиса не рискуетслучайно импортировать символы из пространства имен std ::, тоже.

Итак, мои вопросы:Мне не нравится, что существует пустое пространство имен для деталей реализации, которое «теоретически» видно всем.Есть ли лучший способ, чтобы иметь возможность использовать много символов для e. г. std :: без утечки этих AND без префикса каждого символа, явного с std ::? (Я также думаю о сгенерированных API-документах, которые показывают «bob :: impl _ :: XYZ» вместо «bob :: XYZ».)Я думаю, это не очень СУХОЙ, чтобы повторить std :: a. s. о. снова и снова везде. Я также понимаю, что относительно глобальное «использование пространства имен std» внутри более широкой области видимости (например, класса) не так уж и прекрасно, но, на мой взгляд, сотни префиксов std :: гораздо страшнее.Помимо проблем с отравлением: что, по вашему мнению, лучше и ПОЧЕМУ? Или получил совершенно другую идею?

Хорошо, я надеюсь, что мой вопрос понятен. Спасибо за прочтение! :)

Ответы на вопрос(1)

Ваш ответ на вопрос