我正在使用omniORB和c++。
在我的应用程序中,我得到几个小的CORBA序列形成不同的模块,然后我需要将它们组合成一个大序列进行进一步处理。有简单的方法吗?比如seq2.append(seq1)
或seq2.push_back(seq1)
。或者一些运营商?(我在stl方面真的是新手)。
我发现的唯一方法是手动遍历小序列的每个元素,并将其添加到大序列中。
//idl
struct Device;
typedef sequence<Device> DevicesList;
//c++
icore::DevicesList full_list;
foreach (const DStatusList &stlist, states_) {
icore::DevicesList list = convertList(stlist);
int newlength = full_list.length() + list.length();
int last_index = full_list.length();
full_list.length(newlength);
int j=0;
for(int i=last_index; i< last_index+list.length(); i++,j++) {
full_list[i] = list[j];
}
}
谢谢。
编写这样的小实用函数并不难。例如,您可以为CORBA序列创建自己的push_back:
template<class Seq, class T>
void push_back(Seq& seq, const T& item)
{
const CORBA::ULong len = seq.length();
seq.length(len + 1);
seq[len] = item;
}
MySequence s;
push_back(s, 42);
请注意,一些ORB的序列类型不会在push_back
上过度分配内存(就像std::vector
那样),所以这可能会在每个push_back()
调用上触发重新分配和复制。这可能是性能问题。您必须检查您的ORB是否这样做,可能是通过查看源代码来了解这是否是一个问题。不幸的是,我认为omniORB有这个问题;至少几年前是这样的。
缓解这种情况的一种方法是构造具有最大值的序列(如果你事先知道的话)。这将预先进行一个大的分配,然后您可以调用push_back()
到该最大值,而不会触发重新分配:
MySequence s(100); // construct with maximum; allocation happens here
push_back(s, 42); // no reallocation
push_back(s, 0); // no reallocation
我也同意stefaanv在评论中的建议。尽量少使用CORBA序列。基本上只在需要发出/接收CORBA调用的应用程序的"边缘"使用它。将数据放入标准容器中,以便于尽快对其进行操作。不要让CORBA类型"渗透"到您的应用程序中。如果您决定移植到非corba环境,这还有助于使您的应用程序更具可移植性。
我还听说有人提出了一个新的IDL到c++ 11的映射。这将IDL序列直接映射到std::vector
,这将使事情变得相当容易。