Переименование класса в C ++ - PullRequest
5 голосов
/ 12 мая 2011

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

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

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

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

Большое спасибо за вашу помощь.

Ответы [ 4 ]

14 голосов
/ 12 мая 2011
typedef MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass MyClass;

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

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

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

2 голосов
/ 27 марта 2012

Мне кажется, это работает

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

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

MyClass<int> foo;
MyClass<float> bar;
2 голосов
/ 12 мая 2011

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

0 голосов
/ 12 мая 2011
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

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

...