2017-12-17 11 views
0

私はこの列挙、労働組合、および構造体があります。私は、動的に別の変数に基づいて組合内の変数にアクセスする方法を知っていただきたいと思いアクセス組合が動的に

union num { 
    int i; 
    short s; 
    float f; 
    double d; 
}; 
enum tag {SHORT, INT, FLOAT, DOUBLE}; 
struct vrnumber { 
    num num; 
    tag type; 
}; 

を(すなわち、ユーザの入力)。 (つまり)私は、共用体の変数で特定の操作を行いたいですが、実行時にどの共用体変数にアクセスするかを知りたいのです。

私は値を格納または使用する労働組合にアクセスすると、すべての場合には、それが唯一の違いは、同じ操作されている間、非常に長く、冗長だと思う
vrnumber m; 
switch (m.type) { 
    case SHORT: //an operation .. 
    case INT: //same operation ... 
    case FLOAT: //same operation ... 
    case DOUBLE: //same operation ... 
} 

:だから何が良い方法の代わりのようなものになるだろう。これを行うには

+0

最後に書き込まれたもの以外のユニオンのメンバーからの読み取りは、未定義の動作です。なぜあなたは組合を使いたいのか説明できますか? –

+3

[バリアントタイプ](https://en.wikipedia.org/wiki/Variant_type)を作成しようとしているようです。そこには、このデザインパターンの既存の例がたくさんあります。 – MrEricSir

答えて

1

方法は、構造体の定義で使用されようとしている演算子を定義することです。オペレータ-を使用しようとする場合、例えば、これらのメソッドを定義します。

struct vrnumber { 
    num num; 
    tag type; 

    //between vrnumbers 
    vrnumber operator- (const vrnumber& rhs); 

    //vrnumbers and basic types 
    vrnumber operator- (const int& rhs); 
    vrnumber operator- (const double& rhs); 

    //if vrnumber is used as rhs 
    friend vrnumber operator- (const int& lhs, const vrnumber& rhs); 
    friend vrnumber operator- (const double& lhs, const vrnumber& rhs); 
}; 

これらは、これらの方法のいくつかの定義の例を示します。ここでは

vrnumber vrnumber::operator- (const vrnumber& rhs){ 
    switch(type){ 
     case SHORT: 
      switch(rhs.type){ 
       //...... 
       //cases here 
     } 
     //...... 
     //cases here 
    } 
} 
vrnumber vrnumber::operator- (const int& rhs){ 
    switch(type){ 
     case SHORT: return num.s-rhs; 
     case INT: return num.i-rhs; 
     case FLOAT: return num.f-rhs; 
     case DOUBLE: return num.d-rhs;   
    } 
} 
vrnumber operator- (const int& lhs, const int& rhs){ 
    switch(rhs.type){ 
     //.......... 
     //...cases, same as the others 
    } 
} 

は、これらの操作のいくつかの例を入れています使用する:

vrnumber m1; 
vrnumber m2; 
int i1; 
float f1; 
//the example: 
m1=f1-(m1-m2)-i1; 

このアプローチを使用するトレードオフは、長時間の演算子の定義です。しかし、この種の操作がコード内でA LOTと指定されていると、コードが短縮され、シンプルになる可能性があります。

関連する問題