6.20 在命名空间中重命名模板类型

曾经提过,当%rename包含参数时,参数类型必须准确匹配(不执行typedef或命名空间解析)。SWIG对待模板类型的方式稍微不同,不像非模板类型,对模板类型有额外的匹配规则,不总是需要准确匹配。如果指定了全限定模板类型,它将比通用模板类型拥有更高的优先级。在下面的例子中,通用模板类型被用于重命名到bbb,全限定类型被用于重命名到ccc

  1. %rename(bbb) Space::ABC::aaa(T t); // will match but with lower precedence than ccc
  2. %rename(ccc) Space::ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence
  3. // than bbb
  4. namespace Space {
  5. class XYZ {};
  6. template<typename T> struct ABC {
  7. void aaa(T t) {}
  8. };
  9. }
  10. %template(ABCXYZ) Space::ABC<Space::XYZ>;

现在很明白,通过%rename有几种方式可达到重命名的效果。可以通过下面两个例子进行演示,同时也显式了%rename指令可以放在命名空间中:

  1. namespace Space {
  2. %rename(bbb) ABC::aaa(T t); // will match but with lower precedence than ccc
  3. %rename(ccc) ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence than bbb
  4. %rename(ddd) ABC<Space::XYZ>::aaa(XYZ t); // will not match
  5. }
  6. namespace Space {
  7. class XYZ {};
  8. template<typename T> struct ABC {
  9. void aaa(T t) {}
  10. };
  11. }
  12. %template(ABCXYZ) Space::ABC<Space::XYZ>;

注意,bbb不会被匹配,因为没针对参数类型的命名空间解析,对模板类型的展开必须制定全限定类型。下面的例子显示了%rename是如何被用在%extend指令之中的:

  1. namespace Space {
  2. %extend ABC {
  3. %rename(bbb) aaa(T t); // will match but with lower precedence than ccc
  4. }
  5. %extend ABC<Space::XYZ> {
  6. %rename(ccc) aaa(Space::XYZ t);// will match but with higher precedence than bbb
  7. %rename(ddd) aaa(XYZ t); // will not match
  8. }
  9. }
  10. namespace Space {
  11. class XYZ {};
  12. template<typename T> struct ABC {
  13. void aaa(T t) {}
  14. };
  15. }
  16. %template(ABCXYZ) Space::ABC<Space::XYZ>;