В прошлом, я бы писать классы так:Пространства имен C++ в качестве модулей?
// my_class.h
class MyClass
{
public:
// Signals emitted by MyClass objects.
typedef boost::signal<..> SignalA;
typedef boost::signal<..> SignalB;
enum SomeEnum
{
..
};
enum AnotherEnum
{
..
};
typedef some_type SomeOtherType;
// an exception thrown by MyClass objects
class ExceptionA
{
..
};
MyClass();
// rest of class definition omitted
};
То, что я всегда ненавидел этого стиля является то, что он свернут объявление класса. Итак, для недавнего проекта я решил попробовать что-то новое. Я решил использовать пространство имен способом, аналогичным тому, что модули в Python (мы также используем Python много, где я работаю):
// my_class.h
namespace my_class
{
// Signals emitted by MyClass objects.
typedef boost::signal<..> SignalA;
typedef boost::signal<..> SignalB;
enum SomeEnum
{
..
};
enum AnotherEnum
{
..
};
typedef some_type SomeOtherType;
// an exception thrown by MyClass objects
class ExceptionA
{
..
};
class MyClass
{
public:
MyClass();
..
};
}
И результат был не так уж плохо. Единственным недостатком является то, что вам всегда приходилось префикс «my_class ::» перед всем. Но это можно было бы облегчить, используя «использование» заявлений.
Я собираюсь начать другой проект, и я думал об этом снова. Существуют ли какие-либо серьезные недостатки (за исключением увеличенной детализации) для принятия этого использования пространств имен?
Я бы сказал, что увеличенная многословие - это хорошо, и почти полностью перестали использовать инструкцию 'using'. По-прежнему используйте его для глубоко вложенных пространств имен, например, в Boost. У меня также есть много вложенных (только пары уровней) пространств имен в моих проектах, и почти единственный код не в пространстве имен является функцией 'main'. –