c++ - 跟踪派生类的成员参数
问题描述
假设我有一个库,其中包含一个名为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();
通过所有参数进行女巫检查,即使没有为向量和矩阵创建它们。
我正在寻找更好的解决方案。一个想法是,如果我new
在INode
类中重载运算符会怎样,这样派生类中任何类型的每个新创建的参数都会在内部以这样的方式注册,即它被赋予很少的状态参数和很少的标准函数 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);
// ...
};
}
解决方案
推荐阅读
- sql-server - 如果除一列之外的所有值都相等,则显示一行
- python - 如何正确打包python依赖项
- python - 从其他目录中的 py 文件导入函数时出错
- python - pyodbc/sql - 新创建的表将进入主数据库而不是指定数据库
- google-drive-api - 为什么在google-api-services-drive中使用共享驱动器的fileId时“找不到文件”?
- python - 将数据类序列化为 dict 时属性未出现
- c - 如何有效地将一组字符串写入命名管道?
- html - 在移动应用中滚动时,使用什么 CSS 规则来消除烦人的水平空白?
- python - 得到了一个奇怪的 ROC 曲线和分类器的 AUC
- php - 如何在 Laravel 中打印出包含多个产品的所有订单?