gpt4 book ai didi

c++ - 从字符串中动态生成类构造函数

转载 作者:行者123 更新时间:2023-11-28 05:41:52 27 4
gpt4 key购买 nike

在我的信息模型中有超过 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 是为了调用类的析构函数,不是一个好的实现但是它有效并且不是真正的主题 ;) )

再深入一点:在我的信息模型中有

  1. 一个数据类型对象,和
  2. 实例-该类型的对象。

在析构函数中,我想删除该类型的所有实例(它们被标记在列表中)。不过,这一切都发生在特定的 datatype.cpp 文件中。 DummyObject 只是为了调用析构函数(删除实例)而创建

是否有可能在 c++ 中使用一些魔法在带有 ObjID 信息的代码段中生成这两行?

auto dummyTypeInstance = new NamespacePrefix::AutomationDomainTypeBase(UaNodeId(NamespacePrefixId_AutomationDomainType, 2),
UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot);

// ...

dummyTypeInstance->~AutomationDomainTypeBase();

我不想使用脚本来生成代码(那样会太长)。

最佳答案

我认为您正在寻找的是模板。

让我们定义一个适用于任何类型的通用模板函数

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);
}

关于c++ - 从字符串中动态生成类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36934499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com