我有一个包装类,它将protobuf作为私有成员myInstance
。 protobuf包含一个optional bytes payload
我想在包装类中使用函数模板进行设置(使包装类有效负载不可知,直到模板实例化)。
我在包装类中编写了这个set_payload函数:
template <typename T>
inline void set_payload(const T& somePayload)
{
uint32_t payloadSize = somePayload.ByteSize();
uint8_t* serializedPayload = new uint8_t[payloadSize];
somePayload.SerializeToArray(serializedPayload, payloadSize);
myInstance->set_payload(serializedPayload, payloadSize);
delete [] serializedPayload;
}
此函数可以使用任何protobuf并将其序列化到包装类内payload
的{{1}}成员中。
我的问题是额外的内存分配步骤。我想在函数模板中删除new和delete的使用,因为无论如何都会为myInstance
分配这个内存。可能的?
该函数的身份可能是myInstance::payload
,而不是模板。相同的实现。
答案 0 :(得分:1)
Protobuf现在有移动感知的setter 接受rvalue引用。
要为payload
使用移动感知设置器,您需要执行以下操作:
将serializedPayload
设为std::string
std::string payload;
将其增长到所需的大小:
payload.resize(payloadSize);
序列化为其数据:
somePayload.SerializeToArray(payload.data(), payloadSize); // c++17, or
somePayload.SerializeToArray(&payload[0], payloadSize); // c++<17
调用move-aware setter:
myInstance->set_payload(std::move(serializedPayload), payloadSize);