Можем ли мы назвать имя класса так, как мы это делаем в пространствах имен?
Можем ли мы назвать имя класса так, как мы это делаем в пространствах имен?
Например:
namespace longname{ }
namespace ln = longname;// namespace aliasing
class LONGNAME {};
class LN = LONGNAME; // how to do class name aliasing, if allowed?
Ответ 1
Простой:
typedef LONGNAME LN;
Typedefs используются в С++ как "переменные, которые могут хранить типы". Пример:
class Car
{
public:
typedef std::vector<Wheel> WheelCollection;
WheelCollection wheels;
};
Используя Car::WheelCollection всюду, а не std::vector<Wheel>, вы можете изменить тип контейнера в одном месте и изменить весь код на изменения. Это метод С++ для абстрактного типа данных (тогда как, например, в С# у вас есть свойство, возвращающее IEnumerable<Wheel>).
Edit:
Однако при использовании шаблонов могут возникнуть проблемы. См. здесь для возможного решения.
Ответ 3
Помимо ответов, уже предоставленных с помощью ключевого слова typedef, вы также можете использовать ключевое слово using с С++ 11. IMHO выглядит более последовательным в отношении псевдонимов.
namespace longname{ }
namespace ln = longname;// namespace aliasing
class LONGNAME {};
using LN = LONGNAME; // "class aliasing"