0

XML を使用して Apache/PHP Web ページと交換する一連の入力変数と一連の出力変数を持つプログラムがあります。Web ページは、ユーザーが構成/進行中の内容を確認したり、設定を変更したりできる場所です。

XML を PHP プログラム (Unix_domain Sockets を使用) に渡すときに、渡す設定とインジケーターに関する多くのメタ情報を追加します。データ型、最小、最大、デフォルト、読み取り/書き込み権限など。

<temperature datatype="INT32" min=-"40" max="150" permissions="R/O">25</temperature>

アウトバウンド xml を作成するときに、各変数に関するメタデータを知る必要があります。これを行う良い方法は、各変数に関連付けるクラス VarInfo を作成することです。変数名をキーとしてマップに格納する代わりに (常に変数名を知ることができるとは限りません)、キーを変数へのポインターにし、値をその変数の VarInfo オブジェクトへのポインターにすることを考えました。混合ポインター型を格納する唯一の方法は、それらをすべて void* にキャストすることです。したがって、次のようなものです:

bool cmpr( void* a, void*b) { return (long)a < (long)b;};
std::map<void*,VarInfo*,cmpr>   VarMap;

int        temperature;
VarInfo    vi_temperature;

VarMap[(void*)&temperature] = &vi_temperature;

これを行うと、マップの宣言に関する一連のエラーが作成されます。

expected a type, got ‘cmpr’ ACT_iod.cpp
Invalid template arguments  ACT_iod.cpp line 40 Semantic Error
invalid type in declaration before ‘;’ token
type/value mismatch at argument 3 in template parameter list for 
    ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’  

それで、誰かが私がこれをどのように機能させるかを提案し、おそらくメタ情報を保存するより良い方法を提案できますか? キーとして std::string に変更することをまだ考えています。

ありがとう。

4

1 に答える 1

3

の 3 番目のパラメーターはstd::map、コンパレーターの型である必要があります。1つの修正として、ファンクターを作成できますcmpr(これは、インライン化できないため、多くの場合推奨されるアプローチです):

struct cmpr {
  bool operator()(void* a, void* b) {...}
}
std::map<void*,VarInfo*,cmpr>   VarMap;

もう 1 つの方法は、関数ポインター ( bool(*)(void*, void*)iirc) の型を使用し、コンストラクターのパラメーターとして実際に使用される関数へのポインターを与えることです。

bool cmpr( void* a, void*b) { return (intptr_t)a < (intptr_t)b;}
std::map<void*,VarInfo*,bool(*)(void*, void*)>   VarMap(&cmpr); 

編集:今考えてみると、ポインターのデフォルトの比較はとにかくです。そのため、移植性が高いという利点がある方を<使用できます。std::map<void*, VarInfo*>一般に、ポインタを にキャストすることは避けるべきlongです。可能であれば、整数キャストへのポインターを避けます。それ以外の場合はintptr_tuintptr_torを使用することをsize_tお勧めします。これlongは、ポインターを保持するのに十分な大きさであることが保証されていないためです (また、一部の 64 ビット プラットフォームでは long は実際には 32 ビットです)。

于 2012-06-28T18:53:09.780 に答える