C++ 多方法和编译时检测

标签 c++ multimethod

我有以下代码:

class A{};
class B: public A{};
class C: public A{};

class MyVisitor
{
   public:
       void visit(B*);
       void visit(C*);
};

然后是A*对象的集合,我想实现如下:

1)

MyVisitor visitor;
for(vector<A*>::iterator it = vec.begin(); it!= vec.end();it++)
     visitor->visit(a);

2) 以某种方式在编译时确定,如果 A* 指向派生对象 D,并给出编译器错误,如果 MyVisitor::visit(D*) 函数不存在

我知道 1) 可以通过一些多方法实现来实现,我想我可以找到一些用于 c++ 的多方法实现。但是 2) 有可能吗?

最佳答案

您可以像这样使用 dynamic_cast(在您的 for 循环体内),因为行为应该在运行时发生变化(根据实际数据类型) .

   ClassB* ba = dynamic_cast<ClassB*>(a);
   if (ba)
      visitor->visit(ba);
   ClassC* ca = dynamic_cast<ClassC*>(a);
   if (ca)
      visitor->visit(ca);

也许您的 visit 函数可能被声明为 virtual(对于您的 ClassD 事物)。

否则将您的类组织为类树(而不是森林),并拥有最顶层的根类

  class Topmost {
     virtual int classnum() const;

并采用约定,每个非抽象类都赋予其唯一的classnum等...或者具有元类机制(例如Qt具有)

关于C++ 多方法和编译时检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25563460/

相关文章:

haskell - Haskell 函数什么时候应该采用元组,而不是多个参数?

c# - .Net 4.0 重构现有 "if"条件和 "is"运算符的优化代码

c++ - 寻找递归关系和矩阵求幂

c++ - Xerces C 2.7 无法获得 SONGWriter

java - 虚拟表/调度表

clojure - 多方法的通用语法

emacs - 通过 Slime 重新加载多方法

clojure - 使用跨多个命名空间定义的 Clojure 多方法

c++ - 虚函数指针是虚表索引吗?

c++ - 结构上未声明的标识符