4

我有

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_bazdst::dst_bazsrc::src_quxas dst::dst_qux

除非我弄错了,否则using语句和命名空间别名都不能完成另外两个。为 编写模板转发函数dst_baz()是一种可能,但需要了解src_baz. 模板类型定义可能有dst_qux<T>::typesrc_qux<T>但间接增加了冗长。

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

4

3 回答 3

2

对于功能,您必须手动转发请求。对于非模板类型,您只需 typedef。对于模板类型,可以使用usingc++11 的新特性来为模板创建 typedef 风格的别名,如果你的编译器支持的话,否则你基本上就倒霉了。

于 2012-02-01T04:33:50.370 回答
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为方便起见只使用 s 。毕竟,这就是他们的目的。

于 2012-02-01T04:19:18.420 回答
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);
于 2012-02-01T04:24:43.020 回答