2011-01-12 5 views
8

2つのint引数を持つさまざまな関数があります(関数と呼び出しコードの両方を自分で記述します)。私はいくつかの呼び出しで引数の順序を混同することを恐れています。C++:2つのint引数の型を区別するために型安全性を使用する

タイプセーフティを使用してコンパイラに警告したり、誤ったシーケンスの引数(すべての引数がint)を持つ関数を呼び出すとエラーが発生することはありますか?

私はのtypedefを試してみました:typedefが任意のコンパイラの警告やエラーをトリガしません:

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

foo(y,x); // compiled without warning) 
+1

次のような便利な機能があります。http://calumgrant.net/units/units.html –

答えて

12

ラッパークラスを作成する必要があります。 2つの異なる単位(たとえば、秒と分)があり、どちらもintとして表現されているとします。タイプセーフであるためには、以下のようなものが必要です:

class Minute 
{ 
public: 
    explicit Minute(int m) : myMinute(m) {} 
    operator int() const { return myMinute; } 

private: 
    int myMinute; 
}; 

と同様のクラスです。明示的なコンストラクタを使用すると、誤ってintMinuteとして使用することはできませんが、変換演算子を使用すると、intが必要な場所でMinuteを使用することができます。

+5

より完全で一般的な実装については、http://www.boost.org/doc/libsを参照してください。 /1_42_0/boost/strong_typedef.hpp – UncleBens

4

typedefは、型の別名を作成します。あなたが発見したように、型の安全性はありません。

1つの可能性は、達成しようとしていることに応じて、enumを使用することです。それは完全にタイプセーフではありませんが、それはより近いです。たとえば、キャストせずにintをenumパラメータに渡すことはできません。

-5

ポストツーノートを入手してください。大文字で「X FIRST!THEN Y!」と書いてください。それをコンピュータの画面に貼り付けます。私は正直なところ、他に何をアドバイスするのか分からない。ポストイットとマジックマーカーで問題を解決できるときは、ラッパークラスを使用することは確かに難題です。

+5

地理的ソフトウェアの開発者に依頼してください。それは緯度/経度または緯度/経度ですか?ラッパークラスがうまく機能していない古典的なケースです。 – MSalters

関連する問題