1

Table Data Gatewayの実装を継承し、いくつかの実行時エラーをコンパイル時エラーに変換しようとしています。テーブルとクラスの間には単純な 1 対 1 のマッピングがありますが、すべての CRUD 操作がすべての型に対して意味があるわけではありません。(単純化された形式で) 次のような単一の「マネージャー」クラス テンプレートがあります。

template <typename T>
class object_manager
{
public:
    void create(const T&){ /* SQL CREATE */ }
    void update(const T&){ /* SQL UPDATE */ }
    void del(const T&){ /* SQL DELETE */ }
    template <OutIt> OutIt read(OutIt) const {/* SQL SELECT */}
private:
    some_db_connection& m_db;
};

各永続型に、そのオブジェクト型に有効な操作のみから構築された関連付けられた object_manager があるように、実装の mixin 型に切り替えたいと思います。CRUD関数を独自のクラスに分割すると、次のようになることがわかりました

template <typename T>
class object_manager
{
public:
    typedef T object_type;
protected:
    some_db_connection& m_db;
};

template <typename Base>
class create_mixin : public Base
{
public:
    typedef Base::object_type object_type;
    void create(const object_type&) { /* sql INSERT */ }
};

template <typename Base>
class read_mixin : public Base
{
public:
    typedef Base::object_type object_type;
    template <OutIt> OutIt read(OutIt) const {/* SQL SELECT */}
};

template <typename Base>
class update_mixin : public Base
{
public:
    typedef Base::object_type object_type;
    void update(const object_type&) {/* SQL UPDATE*/}
};

template <typename Base>
class delete_mixin : public Base
{
public:
    typedef Base::object_type object_type;
    void del(const object_type&) {/* SQL DELETE*/}
};

次に、有効な操作のみで型を生成できるため、コンパイル型で誤った関数呼び出し (不変型を更新しようとする試みなど) を見つけることができます。

//read-only
read_mixin<object_manager<some_persistent_type>> read_only_mgr;

//un-deletable
create_mixin<read_mixin<update_mixin<object_manager<some_persistent_type>>>> undeletable_mgr;

これらの object_manager 型をコンパイル時に boost::mpl::vector から生成できるようになり、有効な操作をリストした永続型の特性クラスを作成できるようになりたいと考えています。

struct op_create;
struct op_read;
struct op_update;
struct op_delete;

template <typename T>
struct my_traits
{
    typedef boost::mpl::vector<op_create, op_read, op_delete> valid_operations;
};

やや象徴的な名前 (op_read、op_create など) を実際の mixin クラスにマッピングするのは簡単ですが、3 番目のコード ブロックに示されている型を再作成する方法に苦労しています。boost::mpl::inherit_linearly が役割を果たすという漠然とした考えがありますが、すべての部分がどのように組み合わされるかはまだ明確ではありません。

比較的新しい Boost にはアクセスできますが、c++11 にはアクセスできません。

4

0 に答える 0