Есть ли способ использовать операторы boost :: assign без загрязнения пространства имен? - PullRequest
3 голосов
/ 04 февраля 2011

Я стараюсь избегать "использования пространства имен" в моем C ++, чтобы не загрязнять мое пространство имен.Тем не менее, я хотел бы использовать операторы буста присваивания для таких вещей:это приводит к ошибке:

error: no match for 'operator+=' in 'tmp += "abc"'

Есть ли способ использовать эти операторы в boost без использования пространства имен?

1 Ответ

13 голосов
/ 04 февраля 2011

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

Он будет «загрязнять» только область, в которой объявлен using namespace, и в этом случае преимущества (с использованием операторов) намного больше недостатков (это «загрязнение» столь же незначительно, как и размер сфера).

Например, вы могли бы иметь:

void foo()
{
   // no symbol of boost::assign is polluting here

   std::vector tmp;

   {
      using namespace boost::assign ;
      // brings in this scope all the symbols of boost::assign
      tmp += "abc","def","asdf","foo","blah","dfkef";
   }

   // no symbol of boost::assign is polluting here
}

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

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

Как забавное примечание, худшее решение - поместить использование в публичный заголовок с экспортированными символами.

...