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

标签 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 是为了调用类的析构函数,不是一个好的实现但是它有效并且不是真正的主题 ;) )

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

  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/

相关文章:

c++ - 为什么 C++ 析构函数会影响返回值优化的行为

c++ - 什么是数组到指针的衰减?

c++ - C++中this指针的使用

c++ - C++中的公共(public) friend 功能?

C# 设计选择——COM 对象还是另一个类?

c++ - boost::function 变量在析构函数中为空

c++ - 如何使用 gdb 找到全局变量的析构函数调用?

c++ - 需要优化 - 算法实现占用太多内存

Python 3, super .__del__()

c++ - 加速 FFTW 修剪以避免大量零填充