我有
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>::type
为src_qux<T>
,但间接添加了详细程度。
FWIW,我的用例是使用somepackage_someportion_somefuncA
之类的C名称并提供一个名称空间友好的版本somepackage::someportion::somefuncA
,以便其他人可以使用using somepackage::someportion
来简化。
答案 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);