2017-09-13 10 views
-2

私は、プリミティブ型のエイリアスを複数作成しています。 およびはである。C++でプリミティブ型の型チェックエイリアスを作成するには?

住所とIDを一緒に使用しないでください。算術演算で。したがって

私は、次の結果が得られるように、これらのエイリアスの型チェックがしたい:

typedef int A; 
typedef int B; 

A f(A a) { return a+a; }; 

int main() 
{ 
    A a = 5; 
    B b = 5; 
    f(a);  // I would like this to work... 
    f(b);  // and this not to compile. 
} 

は今、これは動作しませんが、私は、ラッパー構造体/クラスを使用することができます知っています - 私は、コードは第二スニペットのように作業していて、明示的にXにすべてのトンを取得することなく得ることができる最高の方法は何

class A { public: int x; A(int xx) { x = xx; }}; 
class B { public: int x; B(int xx) { x = xx; }}; 

A f(A a) { return A(a.x+a.x); }; // this is ugly and I'd want to be able to use: return a+a 

int main() 
{ 
    A a = 5; 
    B b = 5; 
    f(a);  // This will work... 
    f(b);  // This won't compile... 
} 

私の質問はです:ちょうど1部材との「これは醜い」というコメントの行に記されているように、新しいオブジェクトを作成します。

私は、すべての関連する演算子をすべて私の「エイリアス」にオーバーロードすることができますが、それは多くの作業であり、より速く/より良い解決策が得られることを願っています。

ありがとうございました。

PSこれを具体的なSOの質問にするには、ディスカッションではありません。私は、すべてをオーバーロードするのではなく、私が望む結果を達成するための別の方法を求めています。ありがとうございました。

+1

'これは醜いので、私は使いたいと思っています:return a + a'なぜ、演算子int()をオーバーロードしないのですか? [例](https://ideone.com/VKA0​​DO)。 –

+1

2つのIDを追加しても問題ありませんか?結果が再度IDであるべきか?乗算はどうですか?あなたはIDの二乗を取得したいですか? –

+1

https://stackoverflow.com/questions/34287842/c-strongly-typed-using-and-typedefその他を参照してください。 –

答えて

1

私が「ベスト」な方法を知りませんが、あなたがすることができる一つのことは、関連するすべての演算子をオーバーロードして、番号であなたのタイプを区別することができるように一体型テンプレートパラメータを取りますタイプの作成です:

template<std::size_t ID> 
class strongly_typed_int 
{ 
public: 
    explicit strongly_typed_int(int i = 0): i(i) {} 

    // ... 

    strongly_typed_int operator+(strongly_typed_int i) { /*...*/ } 
    // etc... 

private: 
    int i; 
}; 

using security_id = strongly_typed_int<0>; 
using access_code = strongly_typed_int<1>; 
// etc... 
関連する問題