Элегантный способ предотвратить отравление пространства имен в 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 :: гораздо страшнее.Помимо проблем с отравлением: что, по вашему мнению, лучше и ПОЧЕМУ? Или получил совершенно другую идею?Хорошо, я надеюсь, что мой вопрос понятен. Спасибо за прочтение! :)