从String中动态生成Class-Constructor

时间:2016-04-29 09:23:22

标签: c++ destructor

在我的信息模型中,有超过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>

更多洞察力:在我的信息模型中有

  1. 一个DataType-Object和
  2. instance - 该类型的对象。
  3. 在析构函数中,我想删除该类型的所有实例(它们在列表中标记)。这一切都发生在特定的datatype.cpp文件中。仅创建DummyObject才能调用析构函数(删除实例)

    在c ++中是否有可能通过ObjID的信息在片段中生成这2行有一些魔力?

    auto dummyTypeInstance = new NamespacePrefix::AutomationDomainTypeBase(UaNodeId(NamespacePrefixId_AutomationDomainType, 2),
                UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot);
    
    // ...
    
    dummyTypeInstance->~AutomationDomainTypeBase();
    

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

1 个答案:

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