用C ++重命名一个类

时间:2011-05-12 16:01:59

标签: c++ namespaces reference rename using

我有一个我想在我的头文件中引用的类,它位于一长串嵌套命名空间中:MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass。我想以不同的名称使用它,但不是MyVeryLongNamedClass - 更短更有用的内容,例如MyClass

我可以将using MySpaceA::MySpaceB::MySpaceC::MySpaceD放在我的标题中,但我不想导入整个命名空间。我希望有一些像

这样的结构

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

我知道这可以使用名称空间,但我似乎无法使用它来使用类。

非常感谢你的帮助。

4 个答案:

答案 0 :(得分:14)

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>

答案 1 :(得分:2)

使用不能用于别名类 - 因为你需要typedef。你真的需要那些嵌套的命名空间吗? C ++的命名空间功能从未打算成为一种架构机制 - 它只是为了防止名称冲突。如果你没有冲突,大多数情况下你没有冲突,请不要使用它!

答案 2 :(得分:2)

这似乎对我有用

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

现在你可以做到

MyClass<int> foo;
MyClass<float> bar;

答案 3 :(得分:0)

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章

(停止命名空间污染!拿出你的香烟!)