在我的信息模型中,有超过400种数据类型,其名称如下:AutomationDomainType
。类型(构造函数和成员)是由模型生成的,但遗憾的是没有生成析构函数。所以我必须实现他们的析构函数并在我的主函数中调用它们:
void deleteObjectTypeUA(OpcUa_UInt16 ObjID, OpcUa_UInt16 NsIdx)
{
if (ObjID == PrefixId_AutomationDomainType)
{
NodeManagerRoot* pNodeManagerRoot = NodeManagerRoot::CreateRootNodeManager();
auto dummyTypeInstance = new NamespacePrefix::AutomationDomainTypeBase(UaNodeId(PrefixId_AutomationDomainType, 2),
UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot);
dummyTypeInstance->~AutomationDomainTypeBase();
delete dummyTypeInstance;
}
我必须在数据类型.cpp
中手动实现析构函数,但在我的deleteType
函数中,我不想创建400 if else
个条件来创建DummyObject
,之后是析构函数(我创建dummyobject
以便调用类的析构函数,而不是一个好的实现,但它起作用并且不是真正的主题;))< / p>
更多洞察力:在我的信息模型中有
在析构函数中,我想删除该类型的所有实例(它们在列表中标记)。这一切都发生在特定的datatype.cpp
文件中。仅创建DummyObject
才能调用析构函数(删除实例)
在c ++中是否有可能通过ObjID
的信息在片段中生成这2行有一些魔力?
auto dummyTypeInstance = new NamespacePrefix::AutomationDomainTypeBase(UaNodeId(NamespacePrefixId_AutomationDomainType, 2),
UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot);
// ...
dummyTypeInstance->~AutomationDomainTypeBase();
我不想使用脚本来生成代码(这会太长)。
答案 0 :(得分:1)
我认为你要找的是模板。
让我们定义适用于任何类型的通用模板化函数
template <typename BaseDomainType_T, unsigned int PrefixID>
void deleteObject(unsigned int ObjID) {
if (ObjID == PrefixID)
{
NodeManagerRoot* pNodeManagerRoot = NodeManagerRoot::CreateRootNodeManager();
auto dummyTypeInstance = new BaseDomainType_T(UaNodeId(PrefixID, 2),
UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot);
delete dummyTypeInstance;
}
}
让我们定义一些要使用的虚拟类型。这些是您生成的类型
typedef int BaseTypeOne;
typedef unsigned int BaseTypeTwo;
在我们拥有的每个组合中使用模板化功能
void deleteObjectTypeUA(unsigned int ObjID, unsigned int NsIdx) {
//For base type 1
deleteObject<BaseTypeOne, 0>(ObjID);
deleteObject<BaseTypeOne, 1>(ObjID);
deleteObject<BaseTypeOne, 2>(ObjID);
deleteObject<BaseTypeOne, 3>(ObjID);
//For base type 2
deleteObject<BaseTypeTwo, 0>(ObjID);
deleteObject<BaseTypeTwo, 1>(ObjID);
}