• C++模板类继承的一个小技巧


    先说一下background
    前段时间想实现一个Sqlite localstorage的功能,对应不同的Model 实体有不同的table, 每一次sql操作的函数签名中会有model实体中的struct结构作为参数,struct完全不同,无法抽象,如何实现呢?

    方式1:
    每一次操作实现一个函数,如update table1(model struct1) / update table2(model struct2), 这样实现也有好处,简单明了,每个函数签名代表了最最直接的操作,最后把所有的函数签名集合到一个大文件中暴露出来即可,

    所有数据库的操作也只有该大文件一个入口; 缺点是每个函数中大量重复逻辑不好抽离,感觉有点Low。

    方式2:

    一旦觉得有重复逻辑,抽象就会自然而然萌生。简单粗暴,重复逻辑抽离为单独函数,这只是封装的思想,不过确实也能解决一些问题,只是对该场景感觉用处不大。

    再有就是抽离接口,抽象基类,找到共通点,这应该是大多数的想法,也是我写程序经常思考的方式。但是又有问题,这些函数签名都不同(model struct不同),override没有意义,简单的继承根本解决不了问题。

    方式3:

    模板,这确实是一种抽象能力,往往要求更高(我是不太会用模板),大量的开源项目几乎都是模板,似乎扯远了。。。。

    不同的model structk可以用模板来抽象,但是对应的处理逻辑又是不同的(突然想到了什么,咦,这不是虚函数干的事吗),又回到了方式2的问题

    方式2 & 方式3:

    模板继承,base中转化为特定的子类,于是有了下面的代码

    template<typename TableType, typename RowType>
    class SqliteTable
    {
    }
    
    
    template<typename TableType, typename RowType>
    template<typename KeywordType>
    bool SqliteTable<TableType, RowType>::execDeleteRowByKeyword(CppSQLite3DB* sqliteDB, const std::string& columnName, const KeywordType& keyword)
    {
    	// convert base to child spefic instance
    	return static_cast<TableType*> (this)->execDeleteRowByKeyword<KeywordType>(sqliteDB, columnName, keyword);
    }
    

    主要其实就是在父类中直接转化为子类的对象,在编译期就实现了多态,不同于虚函数的运行期  

  • 相关阅读:
    ERROR: do not initialise statics to false
    kernel defconfig
    python --- comment
    python --- for
    Xcode密钥没有备份或者证书过期,出现Valid Signing错误
    [iOS]XCODE5升级之路
    VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测
    [下载] MultiBeast 6.2.1版,支持10.9 Mavericks。Mac上的驱动精灵,最简单安装驱动的方式。
    XCode 5资源文件不自动更新问题
    Microsoft Word 2010/2013 无法创建工作文件 请检查临时环境变量
  • 原文地址:https://www.cnblogs.com/leon032/p/5101957.html
Copyright © 2020-2023  润新知