c++ - 从模板基类派生

标签 c++ c++11

我必须构建一个包含不同类型对象的小型数据库。有一个基本模板化类是个好主意吗,我们称它为数据库,然后从中派生其他类。

例如:

template< typename Record,
          size_t RECORD_SIZE,
          char RECORD_SEP = '!',
          char RECORD_PARAM_SEP = ',',
          char RECORD_FIELD_SEP = '~',
          size_t MAX_RECORDS_PER_QUERY = 5000,
          size_t MIN_RECORD_COUNT = 15000
          >
class Database
{
public:
    typedef Record Record_t;
    typedef std::vector< unsigned char > QueryBuffer;
    Database( const std::string& basePath, const std::string& recordPath, const std::string tableFilename );

    enum class QueryResult
    {
        OK,
        NO_DATA,
        OVERFLOW,
        FUTURE_DATE,
        FUTURE_RANGE,
        ERROR
    };

    void add( void add( const Record_t& r )
    {
        Lock lock( mMutex );
        // ... lots of stuff here
    }

    QueryResult query(QueryBuffer &qb, time_t first, time_t last )
    {
        Lock lock( mMutex );

        // ... lots of stuff here
    }

    QueryResult query(QueryBuffer &qb, time_t first )
    {
        Lock lock( mMutex );

        // ... lots of stuff here
    }

    // protected and private data
};

然后通过这种方式派生类

class GameDatabase : public Database< GameType, 9 >
{
private:
    using MyBase Database< GameType, 9 >;

public:
    GameDatabase( const std::string& basePath )
        : MyBase{ basePath, "g/", "g.dat" }
    {
    }

    // another query method
    QueryResult query(QueryBuffer &qb, size_t first, size_t last )
    {
        Lock lock( mMutex );

        // use protected methods of MyBase

        // .... lots of stuff here      
    }
};

这是个好主意还是更好的解决方案?问题是数据库的定义必须全部内联,这是很长的代码。

最佳答案

这不是一个不寻常的习语,但通常模板参数要么是类型,要么是需要编译时的整数。你希望通过这样编译你的大小和分隔符来获得什么?

我建议你让它们成为数据库的成员,在构造函数中初始化。如果您想内联所有内容,请继续。但是,当您只需要它们是常量时,不要将它们设为模板参数。

关于c++ - 从模板基类派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18984892/

相关文章:

c++ - 为什么 CRichEditControl 隐藏单词周围的边框

c++ - 使用 istream_iterator 读取字符串

c++ - 在 C++ 中如何声明 std::array 的别名?

c++ - std::function 在堆栈数组中使用时崩溃

c++ - GCC 对 lambda 中的静态变量做了什么?

c++ - 为什么子类的 std::is_same 为 false?

c++ - 如何正确替换字符串 C++ 中的字符?

c++ - 在 C++ 中用前导零更改十六进制数的位,(C)

c++ - 辅音计数程序不返回辅音数

c++ - 函数到 Lambda