Объявление использования оператора после объявления пространства имен - PullRequest
1 голос
/ 01 марта 2011

Я пишу служебную библиотеку, которая состоит из нескольких «пакетов».Классы в каждом пакете содержатся в различных пространствах имен.У меня есть идея относительно того, как я могу упростить ситуацию, автоматически объявляя использование операторов в конце объявлений классов (см. Ниже), это позволит избежать того, чтобы программист делал это в файле cpp.

namespace Utility
{
    class String
    {
        // Class Implementation
    };
}

using Utility::String;

Насколько я понимаю, если пользователь включает заголовок String.h и String находится в Utility, то программист захочет использовать String.Очевидно, что это может быть плохо, если есть цепочка внешних классов, включающая в себя кучу файлов, которые загрязняют пространство имен, поэтому я подумал, как сделать вместо этого #define.функциональность может его получить.

Это хорошая идея или я что-то упускаю?

Ответы [ 4 ]

6 голосов
/ 01 марта 2011

Нет смысла использовать пространства имен, если вы просто собираетесь добавить объявление использования для каждого имени, объявленного в пространстве имен.

Разрешить пользователям ваших заголовочных файлов решать, как они хотят использовать заголовки,Если кто-то хочет использовать объявление using, пусть он делает это непосредственно в файле .cpp;это сделает код в этом файле .cpp более понятным, так как будет очевидно, откуда появилось имя.

2 голосов
/ 01 марта 2011

Это кажется в лучшем случае бессмысленным, а в худшем случае раздражающим.

Что плохого в том, что разработчики решают, какие пространства имен использовать и какие полностью квалифицировать?

0 голосов
/ 03 марта 2011

Неужели у вас не может быть другого файла .h со всеми вашими использованиями, такими как my_lib_import_names.h и просто #include, чтобы получить то, что вы хотите?

Возможно, у вас будут проблемы с классами, которые не объявлены, но вы могли бывероятно, обойти это, используя что-то вроде:

#ifdef UTILITY_STRING_H_ 
  using Utility::String;
#endif
..
#ifdef UTILITY_SOMETHING_ELSE_H
   using Utility::SomethingElse;
#endif

..

Как вы думаете?

Таким образом, вы можете сохранить «ожидаемое» поведение в вашей библиотеке.ч, но и так, как вам нравится.Вы также получаете преимущество пространства имен над своими классами (за счет необходимости поддерживать новый файл .h).

0 голосов
/ 01 марта 2011

Честно говоря, я верю, что для этого и нужна директива using namespace. Вам не нужно добавлять этот механизм препроцессора, учитывая, что директива using namespace делает именно это.

...