【发布时间】:2014-08-29 07:22:28
【问题描述】:
我有以下代码:
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) 有可能吗?
【问题讨论】:
-
“多方法”我假设你的意思是多态演员?你有 Clojure 背景吗?
-
@SirDigbyChickenCaesar 多方法是与语言无关的概念(也称为多调度)
-
无论如何,在实例化后的编译时,无法确定(至少在 c++ 的类型系统中)某个类的任意 INSTANCE 是派生类还是基类。
-
它错过了Visitor_pattern 层次结构中的
accept部分 -
也许您会对基于 Boost Variant(二进制访问)的技术感兴趣:stackoverflow.com/questions/18859699/…(我现在找不到其他可能更匹配的示例)
标签: c++ multimethod