0

さまざまな種類のオブジェクトの小さなデータベースを構築する必要があります。基本的なテンプレート化されたクラスを用意することをお勧めします。それをデータベースと呼び、そこから他のクラスを派生させましょう。

例えば:

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      
    }
};

これは良い考えですか、それともより良い解決策ですか? 問題は、データベースの定義はすべてインライン化する必要があり、これは長いコードです。

4

2 に答える 2

1

テンプレート メンバーをインラインで実装する必要はありません。ヘッダーに配置するだけで済みます。一般的なイディオムは、実装用に別のヘッダーを用意し、それをメイン ヘッダーの下部に含めることです。

// foo.hpp
template <typename T>
class foo {
public:
  void bar();
};

#include "foo.tpp"

// foo.tpp
template <typename T>
void foo<T>::bar() { /* code here */ }
于 2013-09-24T15:26:33.763 に答える