Длинные / составные пространства имен при использовании C ++ / CLI - PullRequest
7 голосов
/ 23 марта 2010

Я работаю над проектом, в котором используется смесь C # (95%) и C ++ / CLI (5%).

Соглашение об именах пространства имен, к которому я стремлюсь, - это старый добрый Company.Technology.Etc.. Это прекрасно работает для C #. Теперь я могу перенести это в классы C ++? Я прочитал здесь , что составные пространства имен не поддерживаются в C ++.

Я застрял с неуклюжим

namespace Company {
    namespace Technology {
        namespace Etc {
           ...
        }
    }
}

чтобы оставаться последовательным?

Стоит ли пытаться быть последовательным?

Ответы [ 5 ]

8 голосов
/ 23 марта 2010

Да, вы застряли с этим, посмотрите эту ссылку . На мой взгляд, его стоит использовать, так как оно более читабельно и управляемо для использования пространств имен. Обычно я делаю это и на родном C ++.

2 голосов
/ 26 марта 2010

Чтобы определить типы во вложенном пространстве имен, да, вы должны сделать это, как вы описываете. Но чтобы использовать типы, попробуйте namespace CTE = Company::Technology::Etc; , тогда вы должны быть в состоянии сделать, например, CTE::SomeClass someClass;

2 голосов
/ 23 марта 2010

Arg! Мы сделали это здесь для некоторого кода тоже. Я ненавижу это.

Есть ли серьезная путаница в том, кто подписывает ваши зарплаты? Что происходит, когда Company приобретается OtherCorp, или отдел маркетинга решает, что отныне Technology будет называться eTech? Сколько кода нужно будет изменить?

Как правило, я против использования. Но в подобных ситуациях, когда пространства имен, вероятно, никогда не создавались, и вы просто сохраняете свои будущие изменения кода, я рекомендую следующую строку вместо того, чтобы ставить эту огромную бородавку перед каждой ссылкой:

using Company::Technology;

Пространства имен, как правило, должны создаваться, когда у вас есть несколько связанных классов и объектов, в которых вы склонны вставить одно и то же имя в их идентификатор. Таким образом, вместо того, чтобы называть их foo_operation и foo_class, вы делаете foo::operation и foo::class.

1 голос
/ 22 июня 2018

Начиная с C ++ 17, вы сможете использовать эту форму:

namespace Company::Technology::Etc {
  // ...
}

Что эквивалентно вашему примеру:

namespace Company { namespace Technology { namespace Etc { 
  // ...
}}}
1 голос
/ 18 ноября 2016

Принятый ответ в visual studio 2015 больше не соответствует действительности.

Вы можете использовать со всеми побочными версиями последний файл компилятора / std: c ++ и получить вложенные пространства имен.

...