我有一个基类,因为我想在几个函数中使用不同类型,所以我将其制作成了模板。但我想从这些模板的基类派生出子类,并存储一个这些类的向量。我的想法是在层次结构中创建一个非模板的基类,使用双重分派来确定类型。这样做是否正确?
以下是代码片段:
以下是代码片段:
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_cast,但那感觉很糟糕。所以这是否是解决问题的可靠方案?请给予建议(希望我在示例中没有留下任何明显的语法错误)
(编辑已删除,是我自己的愚蠢错误)
GetBarItemFunction()
或者GetBazItemFunction()
呢?这是代码中不同的Foo模板特化分歧的地方... - Matt