0

バックエンド データベースとして mongodb を使用するアプリケーションがあり、C++ 側でアクセスするために mongo コレクション内で使用されるフィールド名を一元化する方法が必要でした。フィールド名はアプリケーションのさまざまな部分 (シリアル化、クエリなど) で使用されますが、メンテナンスを容易にするために、これらすべての異なる場所でフィールド名を実際にハードコーディングしないことをお勧めします。

最初はシングルトンの使用が頭に浮かびましたが、使用したくないです。また、ブースト フュージョンを使用して型からフィールド名へのマッピングを作成するというアイデアも考えましたが、型はすべて本質的に空の構造体になります。アプローチについて考えていますか?

4

2 に答える 2

0

ブースト融合と列挙を使用したアプローチを維持しました。

enum ActivitySchemaEnum
{
  DEFINITION,
  NAME,
  STATE,
  START,
  END
};

template <ActivitySchemaEnum ACTSCHEMA_V>
struct Field;

typedef boost::fusion::map<
  boost::fusion::pair<Field<DEFINITION>, char const*>,
  boost::fusion::pair<Field<NAME>, char const*>,
  boost::fusion::pair<Field<STATE>, char const*>,
  boost::fusion::pair<Field<START>, char const*>,
  boost::fusion::pair<Field<END>,   char const*>
> actinst_schema;

actinst_schema const ActivitySchema(
  boost::fusion::make_pair<Field<DEFINITION> >("definition"),
  boost::fusion::make_pair<Field<NAME> >("name"),
  boost::fusion::make_pair<Field<STATE> >("state"),
  boost::fusion::make_pair<Field<START> >("start"),
  boost::fusion::make_pair<Field<END> >("end")
);

次に、クライアント コードで次のような呼び出しを行います (単純な呼び出しですが、アイデアはわかります)。

const char* myFieldName = boost::fusion::at_key<Field<DEFINITION> >(ActivitySchema);

クライアントの使用法は少し冗長ですが、実際には、あなたがしていることをかなり自己記述していると思います.

于 2013-07-24T17:34:32.733 に答える