2011-01-08 9 views
2

、私は時々、このようなユーティリティクラスで終わる:C++:C++では、引数の引数変換クラスの良い名前

struct time_ref 
{ 
    time_ref(FILETIME & ft) : ftval(&ft), ttval(0) {} 
    time_ref(time_t & tt) : ttval(&tt), ftval(0) {} 

    FILETIME * ftval; 
    time_t * ttval; 
} 

彼らは、例えばimplcitの変換に依存しています

void Foo(int x, int y, time_ref t) 

根拠:Fooがオーバーロードと他のパラメータを持っている場合、プロトタイプは乗算、例えば過負荷のnumnerを低減しますtのX * 2過負荷に対する3つの過負荷は、6つのプロトタイプであり、上記のコンバータでは3つです(2つのコンバータを使用する場合でも1つです)。


常に:

THYEに異なるこれらの変換を可能にするためにのみ機能のパラメータとして使用されるべき二つまたはmroeタイプための暗黙のコンストラクタを有します

  • 数値タイプがサポートされているタイプ
  • は、値を格納することも、参照を格納することもできます
  • どのようなタイプのフィールドが検出されるかは、上記の場合はnullではありません。別の典型的な実装では)

質問enumフィールドおよびデータ値の和集合である:

1.このパターンの受け入れ/共通の名前はありますか?私は通常、「引数変換器」または「引数アダプタ」と呼びますが、一般的ではないと思われます。

2.正式化するための推奨事項それらがパラメータとしてのみ使用されるようにする方法はありますか?知っておくべき他の何か?

+0

'FILETIME_or_time_t'? – sbi

+0

私は各引数を扱うロジックがいくぶん別々であると思いますので、実際には(arg 1型のカウント)*(arg 2型のカウント)*(arg 3型のカウント)別の実装は必要ありませんか?その場合、おそらくテンプレートを使って(arg 1型のカウント)+(arg 2型のカウント)+(arg 3型のカウント)のオーバーロードに戻ることができます。 –

+0

テンプレートを使用するだけではどうですか? –

答えて

1

シムは、インターフェイスが「完了」した後でも、多くの異なる引数タイプを処理する必要がある場合によく適しています。それは、あなたがモジュラーで、かなり再利用可能な方法で変換を行うことができます。詳細については、this wikipedia entryおよびその参照先の記事を参照してください。

+0

パターンの共通名がないようです。私はこの回答を受け入れました。なぜなら、それは別の実装(名前があっても) – peterchen

1
  1. ご存じのように、C++の「受け入れられる/共通」は実行しているプラ​​ットフォームによって異なります。 UnixのC++プログラムは、例えばWIN32のC++プログラムからの規則を守っています。つまり、私はこれらの種類のクラスを非常に頻繁に見たことがありません。明白な理由から、パフォーマンスのオーバーヘッドが発生します。関数の呼び出しごとに新しいオブジェクトを作成していますが、これはむしろ不要です。しかし、それはあなたにいくつかのコードを保存しますが、特定のケースでは価値があるかもしれませんが、それでも注意深く考慮する必要があります。

  2. 私が知る限り、C++ではクラスをパラメータとしてのみ使用することを制限する方法はありません。少なくとも、コンストラクタでサポートされている型のいずれかを受け取らないとインスタンス化できません。私が考えていることの1つは、コンバータクラス自体を呼び出し間で渡すことを可能にするために、おそらくコピーctorをサポートする必要があるということです(記述したような2つの別個の関数セットがあり、

+0

ありがとうございました。私はプラットフォーム固有ではないと考えています(Win32とUnixの意味で)。タイプはC++で移植可能です。 – peterchen

+0

はい、間違いなく、パターン自体が機能します。私は命名規則を引用していました。 –

0

過負荷にはどのような問題がありますか? Foo(Bar(X))を使って実装されたFoo(X)を定義することは完全に安全です。私はラッパークラスを作ることがはっきりしていると思います。

+0

rationale:imagienを参照してください。3つのWin32リソースID(intまたは文字列のいずれか)を受け取るメソッド:wihtoutアダプタ.8個のオーバーロードが存在します。リソースを識別する第3の方法を追加すると、27の過負荷が発生します。 'Foo(MAKEINTRESOURCE(IDR_TB1)、MAKEINTRESOURCE(IDR_MENU1)、_T(" quickhelp_1 "))'はIMOが 'Foo(IDR_TB1、IDR_MENU1、_T(" quickhelp_1 "))'よりも明確ではありません。 – peterchen

関連する問題