首页 > 解决方案 > 跟踪派生类的成员参数

问题描述

假设我有一个库,其中包含一个名为INode. 该库的用户应该INode用于创建具有ConcreteNode用户专用的任何类型功能的多个具体节点(例如,单个节点)。

现在,如果在任何ConcreteNode我想声明一个“特殊”标量参数的内部,我调用arguments.scalar.add(0)方法,女巫会在标量值的内部向量中创建一个新条目(实际上是std::vector<double>)并使用id = 0. 除了命名的双精度向量之外,我还准备了带有向量 ( ) 和矩阵 ( ) 的scalar容器,以与所示相同的方式调用。arguments.vector.argument.matrix.

所有这一切都是出于这样的想法,即我想跟踪bool is_set;所有参数的状态(例如 )ConcreteNode。这必须在“内部”发生,这样创建者ConcreteNode就不需要通过创建此类状态变量来手动跟踪这些参数。

我目前的方法有效,但仅限于预定义的容器(标量、向量、矩阵)。使用的库是否要使用其他数据类型,他必须在INode类中添加一个新条目。第二个问题是,如果我创建ConcreteNode的女巫只使用一个标量参数,也会创建向量和矩阵的容器。这会导致死代码,不必要的内存使用,最重要的部分是我正在对所有容器发出请求,例如bool arguments.are_set();通过所有参数进行女巫检查,即使没有为向量和矩阵创建它们。

我正在寻找更好的解决方案。一个想法是,如果我newINode类中重载运算符会怎样,这样派生类中任何类型的每个新创建的参数都会在内部以这样的方式注册,即它被赋予很少的状态参数和很少的标准函数 set/get。那么代码可能非常灵活,可能看起来像这样:

struct ConcreteNode : INode
{
ConcreteNode() { bool* arg = new bool; }
void foo() override { /* ... use arg ... */ };
}

在这一点上,我问自己这个样板new是否真的有必要。难道我不能在new操作符周围创建一个包装器,让它看起来像正常的成员初始化,比如bool arg;. 或者,也许我在 cpp 中遗漏了一些巧妙的技巧,让我可以直接跟踪创建的成员。

我希望我清楚地表达了我的想法,你可以帮助我更进一步。

EDIT1:我也在考虑制作一些可能表现得像的模板结构。

struct ConcreteNode : INode
{
ConcreteNode()
{  arguments.add<bool>("arg");
   arguments.set<bool>("arg") = true; }
void foo() override { /* ... bool b = arguments.get<bool>("arg"); ... */ };
}

EDIT2:现在,对于当前的代码状态,我在派生类中声明新参数,如下所示:

struct ConcreteNode : INode
{
ConcreteNode(double a, std::vector<double> b)
{  arguments.add.scalar(0);
   arguments.add.vector(1);

   arguments.set.scalar(0) = a;
   arguments.set.vector(1) = b;
 }
void foo() override 
{ 
   double c = arguments.get.scalar(0);
   std::vector<double> d = arguments.get.vector(1);
   // ...
};
}

标签: c++overloadingwrappernew-operator

解决方案


推荐阅读