Переименование класса в C ++

У меня есть класс, на который я хотел бы сослаться в моем файле заголовка, который находится в длинной цепочке вложенных пространств имен: MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass. Я хотел бы использовать его под другим именем, но не MyVeryLongNamedClass - что-нибудь более короткое и полезное, например MyClass.

Я мог бы поместить using MySpaceA::MySpaceB::MySpaceC::MySpaceD в свой заголовок, но я не хочу импортировать все пространство имен. Я бы предпочел иметь какую-нибудь конструкцию вроде

using MyClass = MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass

Я знаю, что это возможно с пространствами имен, но я не могу заставить его работать с классами.

Спасибо большое за помощь.


person gt6989b    schedule 12.05.2011    source источник
comment
Soneone ДЕЙСТВИТЕЛЬНО любит пространства имен!   -  person John Dibling    schedule 12.05.2011


Ответы (4)


typedef MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass MyClass;

Для шаблонов вы можете использовать ​​определение типа шаблона:

template <typename T>
struct MyClass {
  typedef MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass<T> type;
};

Теперь вы можете ссылаться на MyClass<T>::type вместо MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass<T>.

person Josh Kelley    schedule 12.05.2011
comment
В идеале также исправьте вложение пространств имен, но определения типов позволяют сэкономить на вводе и сделать код более читабельным, особенно с контейнерами STL и другими классами шаблонов, которые в противном случае могут выглядеть как std::vector<std::pair<MyNamespace::MyClass<typeA>, MyNamespace::MyClass<typeB>>>. - person AJG85; 12.05.2011
comment
Я пробовал typedef, но это не работает - компилятор рассматривает MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass как объявление (поскольку это класс шаблона), но он мне нужен для большого количества различных параметров шаблона. поэтому я не могу определить один набор параметров для typedef ... - person gt6989b; 12.05.2011
comment
Я думаю, что единственная реальная альтернатива - определить новый шаблон для кодирования в старом шаблоне, просто изменив имя ... - person gt6989b; 12.05.2011

Использование нельзя использовать для псевдонимов классов - для этого вам нужен typedef. И действительно ли вам нужны эти вложенные пространства имен? Функция пространства имен C ++ никогда не задумывалась как архитектурный механизм - она ​​была просто создана для предотвращения конфликтов имен. Если у вас нет столкновений, которых обычно нет, не используйте его!

person Community    schedule 12.05.2011
comment
Это частично неверно, ключевое слово using можно использовать в качестве директивы для пространств имен, таких как using namespace std;, или в качестве объявления, такого как using std::vector;, однако using следует избегать в файлах заголовков, предпочитая явно указывать std::vector - person AJG85; 12.05.2011
comment
@ AJG85 Я имел в виду, что его нельзя использовать для создания новых псевдонимов для классов. - person ; 12.05.2011
comment
@unaperson Я знаю, поэтому я не проголосовал против или что-то еще, что только разъясняло. - person AJG85; 12.05.2011

Кажется, это работает для меня

template <typename T>
struct MyClass : public MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass<T> {
};

Теперь ты можешь просто сделать

MyClass<int> foo;
MyClass<float> bar;
person gman    schedule 27.03.2012

using namespace MySpaceA::MySpaceB::MySpaceC::MySpaceD

Добавляет пространство имен '... MySpaceD'

using MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass

Добавляет только класс ..MyVeryLongNamedClass в ваше пространство имен.

Вы можете присвоить ему псевдоним с помощью typedef:

 #include <MyBigDeepNameSpaces.hh>

 namespace myPureNameSpace {
    typedef MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass MySomething_t ;
 }

Рекомендуемое чтение

C++ Coding Standards: 101 Rules, Guidelines, and Best Practices
By: Herb Sutter; Andrei Alexandrescu
Publisher: Addison-Wesley Professional
Pub. Date: October 25, 2004
Print ISBN-10: 0-321-11358-6
Print ISBN-13: 978-0-321-11358-0

Глава 57

(прекратите загрязнение пространства имен! Тушите сигарету!)

person Andrew    schedule 12.05.2011
comment
первые два решения с using не годятся. В вопросе я явно объяснил, почему они мне не нужны: один загрязняет пространство имен, а другой - слишком длинное имя. Я пробовал typedef, но это не работает - компилятор рассматривает MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass как объявление (поскольку это класс шаблона), но он мне нужен для большого количества различных параметров шаблона. поэтому я не могу определить один набор параметров для typedef ... - person gt6989b; 12.05.2011
comment
Ты спас мне день! Просто используя using (sic!), Например: using A :: B :: C; - person Equilibrius; 06.10.2019