我正在使用omniORB和C ++。
在我的应用程序中,我得到几个不同模块的小CORBA序列,然后我需要将它们组合成一个大序列以进行进一步处理。
有这么简单的方法吗?类似于seq2.append(seq1)
或seq2.push_back(seq1)
的内容。还是一些运营商? (我真的很喜欢STL-things)。
我找到的唯一方法是手动浏览小序列的每个元素并将其添加到大序列中。
//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];
}
}
谢谢。
答案 0 :(得分:5)
用这样的东西制作小实用功能并不太难。例如,您可以为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
,这将使事情变得相当容易。