2017-02-27 4 views
-1

のメンバーにアクセスすると、次のマクロ考えてみましょう:私は私と一緒にabcのインスタンスを持っているし、今私はabcを使用してv1に値を割り当てる方法を、いくつかのことで今テンプレートクラスのオブジェクト

#define hash<k1,v1> abc 

を、どうやってやるの。

私はまたabc.v1 = 10; を試してみましたが、それらの両方が動作しませんでしたabc->v1 = 10;
を実行しようとしました。簡単な解決策を提供してください。私はabcタイプのよう戻り値の型を持っている機能を持っている

#define mac<a,b> abc 

:としてマクロを考えてみましょう

は、この更新された問題を参照してください。
は、
xyz = func()今すぐxyzの助けを借りて、私がアクセスしにいくつかの値を代入したいと変数「a」にアクセスし、それをxyzを使用して値を割り当てることができますどのように

a = 10; 

を言います。マクロ定義により

+0

abcがポインタであるかどうかわからない場合は、ここで変数の型を見ることはできません。どうやってその定義を見てもわからないのですか? – user

+0

MACROは何を想定していますか? – Jarod42

+0

'std :: hash'の場合、アクセスは' abc [key] = value; 'のようになります。 – Jarod42

答えて

0

abc->または.構文を使用してメンバーのアクセスを可能にしますどちらもクラスhash<k1, v1>または関数hash<k1, v1>、いずれかを意味します。

あなたは静的メンバを持つクラスhash<k1, v1>を持っている場合は、あなたがでメンバーにアクセスする::構文を使用する必要があります。

hash<k1, v1>::v1 
// or 
abc::v1 

それとも、abcのインスタンスを持っている必要があります。

abc xyz; 
xyz.v1 = ...; 

明らかに、hash<k1, v1>がクラスではなく関数を参照する場合、アクセスするメンバーはないので、方法はありません。

5

プリプロセッサマクロの定義が後方にあります。

#define abc hash<k1, v1> 

が次にあなたが例えば行うことができます:あなたがしたい場合abc(に置き換え)に拡張することがhash<k1, v1>、それは逆の方法を定義しなければなりません

using abc = hash<k1, v1>; 

abc xyz; 

そして、それが

hash<k1, v1> xyz; 

はまた、これはプリプロセッサマクロの非常に良い使用ではないことに注意してくださいと同じようになりますが、私はあなたの代わりに、タイプエイリアスを使用することを推奨します

abcは、他のタイプとして使用できる実際のタイプ名です。

0

まず、v1はではなく、という変数です。あなたは、あなたが書いたコードを理解するのに非常に根本的な問題があるようです。 v1はテンプレートパラメータです。 「v1へのアクセス」とは、特にv1が実際にとなる可能性があるため、「アクセス文字列」と同じ意味です。文字列です。ナンセンスです。もちろん数値であるパラメータもありますが、同じことがもう一度あります。v1へのアクセスは3へのアクセスと同じです。変数ではなく、値のみです。

第2:「タイプ」の変数の中で何かをアクセスする方法は、タイプがhashの変数で何かにアクセスするかによって決まります。私はハッシュが何であるかは分かりませんが、std :: hashには1つのパラメータしかありませんが、std :: mapのように振舞うと、通常は[] -bracketsでアクセスします。

はのは、例をやってみましょう:

#define MyMap std::map<string, string> 

MyMap create_some_map(){ 
    MyMap result; 
    result["name"] = "john"; 
    return result; 
} 

int main(){ 

    MyMap some_map = create_some_map(); 
    std::cout << some_map["name"] << std::endl; 
    return 0; 
} 

はそれは難しいことではなかったしませんか?

MyMapがstd :: pairの代わりである場合、some_map.first = ...およびsome_map.second = ...などで要素にアクセスします。 MyMapがEigenライブラリの行列のようないくつかの行列型の場合、おそらくsome_map(i、j)= 4のようにアクセスするでしょう。

もう一度、マクロをコンパイルする前に。他に何もない。通常は言及しませんが、あなたの質問は私があなたがそれを認識していないと思うようにします。

これは、そうしたマクロを使用すると非常に良い理由があるはずです。通常の状況下では推奨しません。間違って使用すると、マクロがかなり悪くなる可能性があります。あなたが本当にあなたの仕事を救うとき、そしてあなたがしていることを絶対に理解しているときだけ、それらを使用してください。私はあなたがいないと思う、申し訳ありませんが、その件名を読んでください。どのように動作するのかを理解していないコーディングは、欲求不満の原因になります。

また、いくつかのプログラマーの答えにのみ同意することができます、 "使用"はこの状況でマクロよりはるかに優れています。ちょうどこれを2回言及する。

関連する問題