当前位置: 首页 > 知识库问答 >
问题:

C动态调度功能

蒯翰墨
2023-03-14

我试图创建一个重载函数,该函数将用对象的动态类型调用。我尽量做到这一点,而不干扰下面的实际类结构,因为我没有直接访问权限(即我无法添加虚拟方法等)

作为一个具体的例子,让我们考虑一个AST类结构,它看起来有点像这样:

class ASTNode {}; // this one is fully abstract; i.e. there's a virtual void method() = 0;

class Assignment : ASTNode {};
class Expression : ASTNode {};

class StringExpr : Expression {};
class MathExpr : Expression {};

我想编写一个函数act,它将ASTNode的一个实例作为参数,并根据其实际的动态类型执行不同的操作。电话是这样的

std::shared_ptr<ASTNode> parsedAST = get_a_parsed_ASTNode(); // ... received from some parser or library
act(parsedAST);

然后,我想根据ASTNode的动态类型采取行动。

void act(std::shared_ptr<MathExpr> expr)
{
  // Do something with Math expressions, e.g. evaluate their value
};

void act(std::shared_ptr<StringExpr> expr)
{
  // Do something with String  expressions, e.g. write their value to the log
};

void act(std::shared_ptr<Expression> expr)
{
  // do something with other types of expressions (e.g. Boolean expressions)
}; 

但目前我无法调用,因为动态类型可能不是“最具体的类型”。相反,我必须手动创建一个调度程序,如下所示,但在我看来,这个方法有点傻,因为它实际上只做调度。

void act(std::shared_ptr<ASTNode> node_ptr)
{
  if(std::shared_ptr<MathExpr> derived_ptr = std::dynamic_pointer_cast<MathExpr>(node_ptr))
  {
    act(derived_ptr);
  }
  else if(std::shared_ptr<StringExpr> derived_ptr = std::dynamic_pointer_cast<StringExpr>(node_ptr))
  {
    act(derived_ptr);
  }
  else if(std::shared_ptr<Expression> derived_ptr = std::dynamic_pointer_cast<Expression>(node_ptr))
  {
     // do something with generic expressions. Make sure that this is AFTER the more concrete if casts
  }
  else if( ... )  // more of this
  {
     
  }
  // more else if
  else
  {
     // default action or raise invalid argument exception or so...
  }
};

这尤其令人讨厌

是否有更好/更智能的解决方案?显然,我很欣赏“原生”解决方案,但我也愿意考虑图书馆。

共有1个答案

方兴旺
2023-03-14

我自己从来没有遇到过这样的问题,但可以想出以下解决方案。

创建模仿原始层次结构的层次结构,具有虚拟act,基础具有基指针,并将其转换为相应的派生指针。

现在,要创建所需的包装器,不需要正确排序的dynamic\u cast,dispach ontypeidstring。所以,您的调度是从字符串到包装器工厂的映射。

当然,对于类型ID字符串,您需要RTTI,但对于动态强制转换,您也需要RTTI。

 类似资料:
  • 动态调度标签即为根据设定的条件在资源调度前动态为宿主机绑定调度标签。 动态调度标签即为根据设定的条件在资源调度前动态为宿主机绑定调度标签,每次调度宿主机绑定的标签不一定相同,从而实现资源的灵活调度。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “主机/调度/动态调度标签” 菜单项,进入动态调度标签页面。 新建动态调度标签 该功能用于设置动态调度标签的条件,为符合动态调度标签条件的

  • 我有一个web服务,它对某个作业进行动态调度。job是一个Java类,它扩展了Quartz job接口 我还公开了一个API,它接收一个jobId、cron表达式,并调度一个新的StartJob(它将具有接收到的ID)。下面是我的Spring配置: 我错过了什么?这样的配置正确吗?从工厂中检索到的作业和触发器是同一个类的新实例还是同一个类实例?

  • 例如,用Java编写的程序在很大程度上依赖于动态调度。

  • 是否可以添加/删除/修改在Quartz Spring Boot中动态安排的作业(在运行时),由使用我的门户的最终用户。由于计划无法从外部访问,我不知道有什么办法。基本上,我需要将所有的时间表信息存储到数据库中并访问它们。Im构建的门户将被大量用户使用,实现这一目标的正确解决方案是什么? 否则我可以像下面这样使用cron吗 每5 mns扫描一次作业以实现此目的。

  • DynamicHeights是一个动态表格元素高度(动态TableViewCell)的例子。实际应用场景在iOS开发中会经常遇到不规律的TableViewCell,往往需要根据内容的多少而动态调整这些Cell的大小。在http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/ 中,有详细的解说开发的流程以及这么处理的原因。里面的大

  • 问题内容: 在上面的程序中,我尝试调用 aObj.b时 遇到错误。 1.为什么我无法通过aObj访问该变量,尽管它引用的是B类? 2.为什么我可以使用show()方法? 问题答案: 你有区分 静态类型 的和 运行时类型 的。 代码如 产生具有静态类型和运行时类型的变量。 在决定允许或不允许的内容时,编译器也只会考虑 静态类型 。 对您的问题: 1.为什么我无法通过aObj访问该变量,尽管它引用的是