2012-02-01 58 views
3

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

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_bazsrc::src_qux作为dst::dst_qux

除非我弄错了,否则using声明和命名空间别名都不能完成其他两项。编写dst_baz()的模板转发功能是一种可能性,但需要知道src_baz的元数据。模板类型定义可能有dst_qux<T>::typesrc_qux<T>,但间接性增加了详细程度。

FWIW,我的使用案例取名为somepackage_someportion_somefuncA等C名称,并提供了名称友好的版本somepackage::someportion::somefuncA,以便其他人为简洁起见可以使用using somepackage::someportion

+0

是'#define'可行的选项吗? – iammilind 2012-02-01 04:22:31

回答

2

对于你将不得不请求手动转发功能。对于非模板类型,您可以只使用typedef。对于模板类型,y可以使用C++ 11的新功能using为模板创建typedef样式别名,如果您的编译器支持它,或者您基本上运气不好。

+1

这是我的预期。谢谢你确认。 – 2012-02-04 03:54:03

0

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

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

首先,导入标题为要逮住命名空间块里面的定义:

namespace foo { 
    #include "src_stuff.h" 
} 

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

然后,使用typedef宽松:

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

瞧,您已经有了一个bar::dst_bar这是一样的src::src_bar本来。如果您不关心在旧名称下可用的定义,请跳过第一步,并为了方便起见而创建typedef。毕竟,这就是他们的目标。

+0

在命名空间中包含包含的文件势必会造成问题...该头文件的实现文件将不具有名称空间,因此将定义与在所包含的头文件中声明的函数不同的函数。这并没有解决问题的主要部分:如何做功能和模板的类型定义的等价物。 – 2012-02-01 04:31:02

+0

@DavidRodríguez-dribeas模板实际上并不干涉'typedef'方法。如果时间太长,甚至可以使用预处理器宏。 – Borealid 2012-02-01 04:34:36

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); 
+0

感谢您使用基于宏的解决方案。 – 2012-02-04 03:53:45