我有一个基类,我制作了一个模板,因为我想改变几个函数所需的类型,但我想从这些模板化的基类派生。我想存储这些类的向量。我的想法是在层次结构中的所有内容之上创建一个非模板化基类,并使用双重调度来确定类型。我这样做是“正确的方式”吗?
这是该场景的代码片段:
class FooBase
{
public:
virtual void Accept( Visitor &v );
};
template<class T>
class Foo : public FooBase
{
public:
virtual void DoThing( const T & );
virtual void Accept( Visitor &v) = 0;
};
template<>
class Foo<Bar> : public FooBase
{
public:
virtual void Accept( Visitor &v )
{
v.HandleBar( *this );
}
};
template<>
class Foo<Baz> : public FooBase
{
public:
virtual void Accept( Visitor &v )
{
v.HandleBaz( *this );
}
};
// 以及许多来自 Foo、Foo 的派生类
然后在另一个班级
class Visitor
{
public:
virtual void HandleBar( Foo<Bar> &f ) = 0;
virtual void HandleBaz( Foo<Baz> &f ) = 0;
};
class Manager : public Visitor
{
public:
void AddFoo( FooBase& f )
{
a.push_back( f );
}
void RunAll()
{
for ( std::vector<std::shared_ptr<FooBase> >::iterator it = a.begin(); it != a.end(); ++it )
{
(*it)->Accept( *this );
// do common action that doesn't depend on types
}
}
virtual void HandleBar( Foo<Bar> &f )
{
Bar item = GetBarItemFunction(); // not shown
f.DoThing( item );
}
virtual void HandleBaz( Foo<Baz> &f )
{
Baz item = GetBazItemFunction(); // not shown
f.DoThing( item );
}
private:
std::vector<std::shared_ptr<FooBase> > a;
};
我只是不知道这是否是“最好的”方法。我可以使用 dynamic_casting,但感觉很脏。那么这是解决这种情况的可靠方法吗?请告知(我希望我没有在示例中留下任何明显的语法错误)
(删除编辑,是我的愚蠢错误)