2016-07-06 10 views
1

私は#defineの束を持っています。値はコントロールできません。彼らは、私はこれらの#defineのすべてをカプセル化し、ローカル(privateconst)構造を持ちたいと、私が働いている現在のクラスで例えば#defineをグループ化する最も良い方法

CFG_FILT0 
CFG_FILT1 
CFG_FILT2 
CFG_DELTA0 
CFG_DELTA1 
CFG_DELTA2 
... 

、3のグループに対になっています。次に、このクラスのいくつかの関数は、これらの値、を読み込む必要がありますが、前述の3のグループでのみ読み込みます。

for (int idx = 0; chIdx < 3; idx++) 
{ 
    GetItem(myStruct[idx].filt) 
    GetItem(myStruct[idx].delta) 
    ... 
} 

読みやすさとメモリ使用量の観点から、このような構造を定義するための最良の方法は何ですか?potentiall構造(myStruct)はこのような何かを可能にすべきですか私はむしろ(上記の例では例えばmyStructFiltmyStructDelta)ただ一つの構造ではなく、3 #defineの各グループに1つを持っているでしょう

+0

"3つのグループごとに1つではなく、ただ1つの構造を持つことに注意してください。だから、なぜ3つのアイテムの配列を含む構造体を作成しないのですか? – Lundin

+3

より多くの具体的なユースケースがなければ、最も有用な目標とその達成方法を推測することしかできません。 –

+0

潜在的 'GetItem()'のすべての用途のインデックスの値はコンパイル時にわかりますか?私。 'GetItem(1)、GetItem(10)'のように見えるか、変数になりますか? – Sergio

答えて

1

私はこれが本当に何であることを100%確実ではありませんよ次のマクロで説明したいのですが、あなたはあなたに同様のアクセスインタフェースを取得することができます。

#define GET(kind, idx) (\ 
     (idx) == 0 ? CFG_ ## kind ## 0 \ 
     : (idx) == 1 ? CFG_ ## kind ## 1 \ 
     : (idx) == 2 ? CFG_ ## kind ## 2 \ 
     : -1 /* or you can assert() here*/) 

と使用することは次のようになります。

GET(FILT, 0); 
GET(DELTA, 2); 

もちろん、このようなアプローチにはいくつかの欠点があります。少なくとも、複数の評価がidxであり、生成されたマシンコードが吹き飛ばされますが、場合によっては有用かもしれません。

そしてインデックスは定数であれば、それは

#define GET(kind, idx) CFG_ ## kind ## idx 

は、このバージョンでは、まったくメモリ/コードのオーバーヘッドを持っていなくても簡単になります。

+0

C++では、マクロを使用するのが悪いスタイルです。代わりにインライン関数を使用してみてください。 – Trantor

+0

@Trantorはい、非常に洗練されたソリューションではありませんが、テンプレートやインライン関数の問題を解決しようとすることができます。私はそれが簡単なマクロよりも簡単になるとは思っていません。 – Sergio

関連する問題