存储 std::shared_ptr 的向量,<Foo>其中 Foo 是一个模板化类
Storing vector of std::shared_ptr<Foo> where Foo is a templated class
我有一个基类,我做了一个模板,因为我想改变几个函数的类型,但是我想从这些模板化的基类派生。我想存储这些类的向量。我的想法是在层次结构中的所有内容之上创建一个非模板化的基类,并使用双调度来确定类型。我这样做是否"正确"?
下面是这个场景的代码片段:
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,但感觉很脏。那么这是解决问题的可靠方法吗?请告知(我希望我没有在示例中留下任何明显的语法错误)
(删除编辑,是我愚蠢的错误)
我想你差不多明白了。我会这样写访问者类:
class Visitor
{
public:
virtual void HandleFoo( Foo<Bar> &f ) = 0;
virtual void HandleFoo( Foo<Baz> &f ) = 0;
//default implementation for unknown Foo types:
virtual void HandleFoo( FooBase &f ) = 0;
};
现在你不需要对模板化的Foo类进行专门化,你可以编写下面的代码来处理应用程序可能需要的所有类T。将根据Foo中使用的模板类型选择正确的重载HandleFoo函数。您仍然需要向访问者类添加方法,以避免调用默认行为。
template<class T>
class Foo : public FooBase
{
public:
virtual void DoThing( const T & );
virtual void Accept( Visitor &v) {
v.HandleFoo( *this );
};
};
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 在构造函数 foo() 中有一个模板是什么意思 <T>C++?
- 为什么 clang++ 只销毁一个 foo 对象
- Is int & foo();一个左值?
- 强制构造像“Foo(12,3);”这样的未命名变量仍然是一个声明符
- Qt 包含另一个项目的类(无法打开包含文件:"foo.h")
- 当一个方法只接受 Foo *const 时,我应该const_cast "this"吗?
- 给一个c++类foo,里面有一个同步方法.如何保证同步方法只能被一个线程访问
- 为什么要创建一个名为*foo()的方法,而不仅仅是foo()呢?
- std::vector<Bar> 作为类 Foo 中的成员变量需要一个空的构造函数
- int* const* foo(int x);是一个有效的 C 函数原型。您如何"read"此返回类型?
- 存储 std::shared_ptr 的向量,<Foo>其中 Foo 是一个模板化类