Длинные/составные пространства имен при использовании C++/CLI

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

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

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

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

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

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


person biozinc    schedule 23.03.2010    source источник


Ответы (5)


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

person Simon Linder    schedule 23.03.2010

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

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

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

using Company::Technology;

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

person T.E.D.    schedule 23.03.2010

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

person tragomaskhalos    schedule 26.03.2010

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

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

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

namespace Company { namespace Technology { namespace Etc { 
  // ...
}}}
person Jake Cobb    schedule 22.06.2018

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

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

person Community    schedule 18.11.2016