C++ 在C++;是否可以重命名/别名非命名空间、非类名?

C++ 在C++;是否可以重命名/别名非命名空间、非类名?,c++,namespaces,using-declaration,C++,Namespaces,Using Declaration,我有 名称空间src{ 结构钢筋; void src_baz(); 模板类src_qux; } 我想把它称为 namespace src { struct src_bar; void src_baz(); template<class T> class src_qux; } 名称空间dst{ 结构测试条; 无效dst_baz(); 模板类dst_qux; } 这意味着我想从src中“重命名”或“别名”或“重新标记”名称 对于dst_bar当然可以使用名称空间d

我有

名称空间src{
结构钢筋;
void src_baz();
模板类src_qux;
}
我想把它称为

namespace src {
   struct src_bar;
   void src_baz();
   template<class T> class src_qux;
}
名称空间dst{
结构测试条;
无效dst_baz();
模板类dst_qux;
}
这意味着我想从
src
中“重命名”或“别名”或“重新标记”名称

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

除非我弄错了,否则使用语句的
和名称空间别名都不能完成另外两个任务。为
dst_baz()
编写模板转发函数是可能的,但需要了解
src_baz
的算术知识。模板typedef可以具有
dst_-qux::type
be
src_-qux
,但间接寻址会增加冗长性

FWIW,我的用例是使用C名称,比如
somepackage\u somepart\u somefuncA
,并提供一个名称空间友好的版本
somepackage::somepart::somefuncA
,以便其他人可以使用
使用somepackage::somepart
,以简洁起见。

不,您不能“重命名”使其不再使用其原始名称的事物

然而,你可以通过欺骗获得同样的效果

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

现在您有了
foo::src::src\u bar
和朋友

然后,自由地使用
typedef

namespace foo {
    #include "src_stuff.h"
}

瞧,你有一个
bar::dst_bar
,它和
src::src_bar
应该是一样的。如果您不关心旧名称下仍然可用的定义,请跳过第一步,为方便起见,只需设置
typedef
s即可。毕竟,这就是他们的目的。

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

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

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

定义
\define
对您来说是可行的选项吗?将包含的文件包含在命名空间中肯定会有问题。。。该头的实现文件将不具有名称空间,因此将定义不同于在所包含的头中声明的函数。这并没有解决问题的主要部分:如何对函数和模板执行与typedef等价的操作。@DavidRodríguez dribeas模板实际上不会干扰
typedef
方法。如果预处理器宏太长,你甚至可以使用它们。谢谢你基于宏的解决方案。这就是我所期望的。谢谢你的确认。
namespace bar {
    typedef foo::src::src_bar dst_bar;
}
// 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);