Morphlng
2021-08-16 10:41
采纳率: 0%
浏览 53
已结题

C++ 能否实现类似Python getattr的写法?

我在写一个解释器,其中Interpreter需要对AST树上的节点做对应的解释,而树上的节点类型为shared_ptr<ASTNode>,即一个个父类指针,他们将指向子类的具体节点。我现在的做法是写了一个visit函数,大体上如下:

RuntimeResult visit(const shared_ptr<ASTNode>& root, Context& context)
{
  if(typeid(*root) == typeid(NumberNode))
  {
    return visit_NumberNode(std::dynamic_pointer_cast<NumberNode>(root), context);
  }
  else if(typeid(*root) == typeid(StringNode))
  {
    return visit_StringNode(std::dynamic_pointer_cast<StringNode>(root), context);
  }
  else{
    return RuntimeResult().failure(RuntimeError("No visit method for current node"));
  }
}

即通过typeid去检查这个节点实际指向的对象类型,这显然是很愚蠢的做法,而且每添加一种新的节点,我总需要回来加一条if判断。请问是否有一种办法能够优化这段代码?

我知道python中有如下功能,c++能否也做到?

def visit(self, node, context):
  method_name = f'visit_{type(node).__name__}'
  method = getattr(self, method_name, self.no_visit_method)
  return method(node, context)
  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

  • 有问必答小助手 2021-08-17 20:24

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    ​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题