我有一个我想在我的头文件中引用的类,它位于一长串嵌套命名空间中:MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass
。我想以不同的名称使用它,但不是MyVeryLongNamedClass
- 更短更有用的内容,例如MyClass
。
我可以将using MySpaceA::MySpaceB::MySpaceC::MySpaceD
放在我的标题中,但我不想导入整个命名空间。我希望有一些像
using MyClass = MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass
我知道这可以使用名称空间,但我似乎无法使用它来使用类。
非常感谢你的帮助。
答案 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章
(停止命名空间污染!拿出你的香烟!)