在此先感谢您的阅读。这是一个挑剔的设计问题,因为我有一个适当的解决方案,但问题是通过模板是否没有更好的方法,而我对此并不十分了解。我有一系列需要存储的数据表类型(从抽象类DataTable派生)。我写了一个“DataTableIndex”抽象类,该类存储 vector DataTable *,并处理所有DataTableIndexes的常规工作-查找,实现代理模式,以便仅在需要时加载表,进行错误检查等。然后,我为每种表类型将其子类化,我需要这样做的唯一原因是因为每种表类型都有一个要调用的特定函数来加载它。我想通过模板以某种方式避免DataTableIndex的这种子类化,因为DataTable的子类很多。class DataTableIndex{ // various functions to implement lookup, Proxy and error checking // functionality common to all DataTableIndexes. // This code needs access to _lookupTable and _theTables DataTable* getTable( int tableNum );private: // These functions call the appropriate user interface function for loading // a table of the subclass' type. // They are called by more general non-virtual public functions virtual bool loadIndex( vector<LookupEntry*>& returnLookupTable ) = 0; virtual DataTable* loadTable( int tableNum ) = 0; vector<LookupEntry*> _lookupTable; vector<DataTable*> _theTables; UserInterface* UI;};此类具有非常简单的子类,这些子类基本上指向User Interface类中的函数,这些函数实际上打开并解析了数据表的文件。class TableTypeA_Index : public DataTableIndex{ virtual bool loadIndex( vector<LookupEntry*>& returnLookupTable ) { return UI->loadTableAIndex( _lookupTable ); } virtual DataTable* loadTable( int tableNum ) { return UI->loadTableTypeA( _lookupTable[ tableNum ] ); }};这足够工作。但是我觉得我应该能够通过模板参数将“loadTableTypeA”传递给DataTableIndex,所以我不必对其进行子类化。我想使用模板的另一个原因是,我不想一直将DataTable *强制转换为实际的表类型。即使我知道在编译时应该使用哪种类型的表,我还是觉得应该使用dynamic_cast 进行错误检查,但是我不希望getTable()的调用者每次都必须这样做(它通常被称为)。我理想的解决方案是: 1)将DataTableIndex类概括为模板,模板参数替换_lookupTable和_theTables中的LookupEntry *和DataTable *。这将消除铸造。2)映射适当的UI函数以加载正确的表类型,而无需子类化。所以基本上我想使用此类看起来像这样(以某种方式)DataTableIndex< LookupEntryTypeAMatlab, TableTypeA, loadTableAIndex(), loadTableTypeA() > theTypeAIndex;我对策略类进行了一些思考,但是我对这种方法的印象是,在这种情况下,我只是将子类移至其他类。 最佳答案 通常,这可以通过使用strategy pattern完成。可以使用简单的组合来实现,因此不需要模板。但是,您仍然必须为每种不同的表类型定义特殊的策略。这将需要子类化:class LoadTableStrategy {public: virtual bool loadIndex( vector<LookupEntry*>& returnLookupTable ) = 0; virtual DataTable* loadTable( int tableNum ) = 0;};对于每个表类型,此类都必须是子类。然后,DataTableIndex将在构造函数中接收LoadTableStrategy的实例,并使用该实例来加载数据,而不是私有(private)虚拟函数。您当然可以将strategy-type作为模板参数传递,但是请注意,这是缺点。用不同的模板参数实例化的两个DataTableIndex对于编译器将是不同的类型。除非创建特定的重载或使函数成为函数模板本身,否则将无法定义可以同时处理这两个函数的函数。关于c++ - C++设计问题:通过模板传递函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5243761/
10-12 00:12
查看更多