【发布时间】:2011-10-24 13:14:18
【问题描述】:
我尝试使用模板派生类实现访问者模式
我使用 gcc 4.5
这里是 VisitorTemplate.hpp,我在 Visitor 类中专门 Derived,但我希望能够处理任何类型:
edit : 感谢 interjay 的建议,现在代码编译运行没有错误
#ifndef VISITORTEMPLATE_HPP_
#define VISITORTEMPLATE_HPP_
#include <iostream>
#include <string>
using namespace std;
template<class T> Derived;
class Visitor
{
public:
virtual void visit(Derived<string> *e) = 0;
};
class Base
{
public:
virtual void accept(class Visitor *v) = 0;
};
template<class T>
Derived: public Base
{
public:
virtual void accept(Visitor *v)
{
v->visit(this);
}
string display(T arg)
{
string s = "This is : " + to_string(arg);
return s;
}
};
class UpVisitor: public Visitor
{
virtual void visit(Derived<string> *e)
{
cout << "do Up on " + e->display("test") << '\n';
}
};
class DownVisitor: public Visitor
{
virtual void visit(Derived<string> *e)
{
cout << "do Down on " + e->display("test") << '\n';
}
};
#endif /* VISITORTEMPLATE_HPP_ */
main.cpp
Base* base = new Derived<string>();
Visitor* up = new UpVisitor();
Visitor* down = new DownVisitor();
base->accept(up);
base->accept(down);
现在我的目标是在访问中使用 Derived 而无需专门化;不幸的是,visit 是一个虚拟方法,所以我无法对其进行模板化
【问题讨论】:
-
你用的是什么编译器?我刚刚将您的示例代码提供给 Visual C++ 2010,它编译得非常愉快,除了抱怨 std::to_string 无法处理模板参数参数类型。在您的示例代码中,我看不出它为什么会抱怨类型不完整的任何原因,因为您没有错过为单个纯虚函数提供实现。
-
@MatthewWalton:“我使用 gcc 4.5。”但是,指出编译器消息引用的行总是很好的。我不想在浏览器中计算 31 行。
-
@sbi doh,我一定忘记了当我为编译器提供代码时。不过,我认为特定类型的错误不会是 GCC 和 VC++ 不同意的类型。
-
好的,忘记我的代码,你有办法处理这个通用的 Vistor 问题吗?
-
有趣。似乎
class的前向声明与templates 并不完全一致
标签: c++ templates design-patterns c++11 visitor-pattern