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

4

I have

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的元数。模板typedef可以使dst_qux<T>::type成为src_qux<T>,但这种间接方式增加了冗余。

值得注意的是,我的用例是接受类似于somepackage_someportion_somefuncA的C名称,并提供适用于命名空间的版本somepackage::someportion::somefuncA,以便其他人可以使用using somepackage::someportion进行简洁。


“#define” 对你来说是可行的选择吗? - iammilind
3个回答

2

对于函数,您需要手动转发请求。 对于非模板类型,您可以使用typedef。 对于模板类型,您可以使用c++11的新using特性创建typedef样式的别名,如果您的编译器支持它,否则您基本上就没有机会了。


1
这正是我所期望的。谢谢你确认了它。 - Rhys Ulerich

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。毕竟,这就是它们的作用。


将包含的文件放在命名空间中会有问题...该头文件的实现文件将没有命名空间,因此定义的函数与所包含的头文件中声明的函数不同。而且这并没有解决问题的主要部分:如何为函数和模板进行typedef的等效操作。 - David Rodríguez - dribeas
@DavidRodríguez-dribeas 模板实际上并不干扰typedef的方法。如果它们变得太长,甚至可以使用预处理器宏。 - Borealid

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

感谢您提供的基于宏的解决方案。 - Rhys Ulerich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接