14.2.2.13. 管理复杂类型数据
在某些情况下,DynamicData
实例管理的复杂类型不能直接通过基本的获取和设置方法进行修改。动态语言绑定提供了两种可能的方法来管理复杂数据类型:
DynamicData::get_complex_value 和 DynamicData::set_complex_value:
- 这些 API 允许获取或设置通用的
DynamicData
。与下一种方法的主要区别在于,此 API 始终会执行数据复制。
- 这些 API 允许获取或设置通用的
DynamicData::loan_value:
- 此 API 允许借用对
DynamicData
的引用,以便处理时防止数据复制。在处理完毕后,必须调用DynamicData::return_loaned_value
来返回借用的数据。如果对已经被借用的值再次调用DynamicData::loan_value
将会失败。
- 此 API 允许借用对
以下代码片段展示了如何使用与结构体类型定义相同的结构来管理复杂数据:
// 基于结构类型创建动态数据
DynamicData::_ref_type data {DynamicDataFactory::get_instance()->create_data(complexstruct_type)};
// 使用复杂 API(复制)
DynamicData::_ref_type complex_data;
data->get_complex_value(complex_data, data->get_member_id_by_name("complex_member"));
// 设置数据
int32_t in_value {10};
complex_data->set_int32_value(complex_data->get_member_id_by_name("first"), in_value);
data->set_complex_value(data->get_member_id_by_name("complex_member"), complex_data);
// 借用 API
DynamicData::_ref_type loan_data = data->loan_value(data->get_member_id_by_name("complex_member"));
loan_data->set_int32_value(loan_data->get_member_id_by_name("first"), in_value);
int32_t out_value;
loan_data->get_int32_value(out_value, loan_data->get_member_id_by_name("first"));
data->return_loaned_value(loan_data);
解释
在上述代码中,首先通过工厂创建了一个基于某个复合结构类型 (
complexstruct_type
) 的动态数据实例。使用
get_complex_value
方法获取名为"complex_member"
的复合数据,并存储到complex_data
中。这一过程涉及到复制,因为它是通过简单的 getter 方法实现的。然后,我们设置这个复杂成员中的第一个整型值为
10
。接着,通过
set_complex_value
将更新后的复合数据存回主动态数据中。对于贷款API部分,通过调用
loan_value()
借用了"complex_member"
的值,这样可以避免不必要的数据复制。在这里,修改了第一项整数值并读取该值,然后最后调用return_loaned_value()
来归还借出的值。
这种方法使得我们能够高效地操作复杂数据类型,同时避免了频繁的数据复制,提高了性能。
内容由零声教学AI助手提供,问题来源于学员提问