使用代码模板¶
模板¶
template 节点注册了一个模板,可以在扩展生成的代码时避免重复代码,它是 typesystem 节点的子节点。
<typesystem>
<template name="my_template">
// the code
</template>
</typesystem>
使用insert-template节点将模板代码(由模板的name属性标识)插入到生成的代码库中。
插入模板¶
insert-template 节点包含由 name 属性标识的代码模板,它可以是 inject-code、conversion-rule 或 template 节点的子节点。
<inject-code class="target" position="beginning">
<insert-template name="my_template" />
</inject-code>
使用replace节点来修改模板代码。
替换¶
replace 节点允许您在将模板代码插入生成的代码之前对其进行修改,并且它可以是 insert-template 节点的子节点。
<insert-template name="my_template">
<replace from="..." to="..." />
</insert-template>
此节点将用to指向的值替换属性from。
预定义模板¶
shiboken 中内置了许多用于 STL 和 Qt 类型转换规则的 XML 模板。
primitive-type的模板:
名称 |
描述 |
|
将 PyLong 转换为 C++ 类型 |
container-type的模板:
一些容器类型是内置的。如果需要明确指定,可以使用以下模板:
|
将 PySequence 转换为 C++ 对(std::pair/QPair) |
|
将C++对(std::pair/QPair)转换为PyTuple |
|
将C++顺序容器转换为PyList |
|
将C++顺序容器转换为PySet |
|
将可迭代的Python类型转换为C++顺序容器(STL/Qt) |
|
将可迭代的Python类型转换为支持reserve()的C++顺序容器 |
|
将可迭代的Python类型转换为固定大小的数组(std::array, std::span) |
|
将 PySequence 转换为集合类型的 C++ 容器(std::set/QSet) |
|
将 std::map/std::unordered_map 转换为 PyDict |
|
将 QMap/QHash 转换为 PyDict |
|
将 PyDict 转换为 std::map/std::unordered_map |
|
将 PyDict 转换为 QMap/QHash |
|
将 std::multimap 转换为值列表的 PyDict |
|
将QMultiMap转换为值列表的PyDict |
|
将 std::unordered_multimap 转换为值列表的 PyDict |
|
将QMultiHash转换为值列表的PyDict |
|
将值列表的PyDict转换为std::multimap/std::unordered_multimap |
|
将值列表的PyDict转换为QMultiMap/QMultiHash |
使用这些模板的 std::list 类型的条目如下所示:
<container-type name="std::list" type="list">
<include file-name="list" location="global"/>
<conversion-rule>
<native-to-target>
<insert-template name="shiboken_conversion_cppsequence_to_pylist"/>
</native-to-target>
<target-to-native>
<add-conversion type="PySequence">
<insert-template name="shiboken_conversion_pyiterable_to_cppsequentialcontainer"/>
</add-conversion>
</target-to-native>
</conversion-rule>
</container-type>