在C ++中可以重命名/别名非命名空间的非类名称吗?

时间:2012-02-01 04:15:37

标签: c++ namespaces using-declaration

我有

namespace src {
   struct src_bar;
   void src_baz();
   template<class T> class src_qux;
}

我想引用

namespace dst {
    struct dst_bar;
    void dst_baz();
    template<class T> class dst_qux;
}

意思是我想从src“重命名”或“别名”或“重新标记”名称。

对于dst_bar,当然可以使用namespace dst { typedef src_bar dst_bar; }。是否有一些(非宏)等价物允许我将src::src_baz重命名为dst::dst_baz而将src::src_qux重命名为dst::dst_qux

除非我弄错了,否则using语句和命名空间别名都不能完成另外两个。为dst_baz()编写模板转发函数是可能的,但需要了解src_baz的arity。模板typedef可能dst_qux<T>::typesrc_qux<T>,但间接添加了详细程度。

FWIW,我的用例是使用somepackage_someportion_somefuncA之类的C名称并提供一个名称空间友好的版本somepackage::someportion::somefuncA,以便其他人可以使用using somepackage::someportion来简化。

3 个答案:

答案 0 :(得分:2)

对于功能,您必须手动转发请求。对于非模板类型,您只需键入def。对于模板类型,y可以使用c ++ 11的新using特性为模板创建一个typedef样式的别名,如果你的编译器支持它,否则你基本上没有运气。

答案 1 :(得分:0)

不,你不能“重命名”某些东西,以便它不再使用它的原始名称。

但是,你可以通过欺骗获得同样的效果。

首先,导入要在命名空间块中存放的定义的标头:

namespace foo {
    #include "src_stuff.h"
}

现在你有foo::src::src_bar和朋友。

然后,自由地使用typedef

namespace bar {
    typedef foo::src::src_bar dst_bar;
}

Voila,你有bar::dst_bar,与src::src_bar相同。如果您不关心旧名称下剩余的定义,请跳过第一步,只是为了方便起见typedef。毕竟,这就是他们的目标。

答案 2 :(得分:0)

如果使用宏是一个可以接受的选项,那么这里有一个解决方案:

// declare this macro in some common file
#define CREATE(SCOPE) \
namespace SCOPE { \
   struct SCOPE## _bar; \
   void SCOPE## _baz(); \
   template<class T> class SCOPE## _qux; \
}

用法:

CREATE(src);
CREATE(dst);