2016-08-05 3 views
0

私はC#プロジェクトに取り組んでおり、自分自身がC++で共通のパターンを再現しようとしていましたが、私は(C++で)やろうとしているものの例:テンプレートプログラミングでC++のtypedefs/aliasを使用することに相当します。

enum ProductItemTypes { 
    Product, 
    Family, 
    SubFamily, 
    Department 
}; 

class ProductItem : PanelItem { 
public: 
    using item_type_t = ProductItemTypes; 
    ... 
}; 

enum PaymentItemTypes { 
    Group, 
    Valued, 
    NotValued, 
    Balance 
}; 

class PaymentItem : PanelItem { 
public: 
    using item_type_t = PaymentItemTypes; 
    ... 
}; 

PanelItemから継承しitem_subtype_t自分のを持っている別のクラスがあります。 次に、PanelItemを使用するクラスは、対応するアイテムタイプを知ることができ、一般的に動作します。

C#で同様の能力のいくつかの並べ替えを持つことは、私の周りには繰り返しのコードの多くを回避するのに役立つだろうが、私は(私は簡単にするために除外していることをいくつかのより多くのProductItemProductItemType、と)すべてのタイプを渡すためにwan'tはありませんすべての時間。

+1

@Barry、私は[tag:C++]を追加しました。あなたはそのソースコードを読むことができる必要があるからです。 – Sinatr

+0

なぜでしょうか:テンプレート クラスパネル{ 公開: .... }; Then Panel foo; 最終的には、上記のようなタイプを定義することができます。 – nosbor

+0

@nosbor他のPanelItemの型定義が異なるので、パネルの部分は重要ではなく、重要な部分は 'ProductItem'の' item_subtype_t'です。 –

答えて

2

それはあなたがこの例を提供していないため、ご利用の場合は、ここにあるまさに伝えるのは難しい:

その後、PanelItemsを使用するクラスは、対応する項目のタイプを知ることができ、一般的に働きます。

PanelItemsを使用するクラスは、これを直接行うことができません。クラスが直接にタイプを取ったテンプレートクラスだった場合、その周りの唯一の方法は、(私は推測しているあなたが実際に何を意味するかで起こっている)ことになります。

template<class T> 
class Foo 
{ 
public: 
    using item_type_t = typename T::item_type_T; 
} 

あなたはできるようにするつもりはありませんC#でこれを行う。構文的にはジェネリックとテンプレートは非常に似ていますが、2つの非常に異なる獣です。 C++のテンプレートは、あなたが作る具体的な型の代入ごとに一度コンパイルされます。これはSFINAEを実行するためのものです。基本的に、コンパイラはテンプレートの使用状況を見るたびに、型パラメータを置き換え、クラスまたはメソッドを再コンパイルしようとします。

C#のジェネリックは、一度だけコンパイルされ、型パラメータには依存しません。これは、C#でのジェネリック制約が存在する理由です。これにより、処理するタイプの種類についてコンパイラに多くの知識を与えることができます。また、C#にはSFINAEの概念がないことも意味します。これは、コンパイラによって実際に置換が行われないためです。

私の意見は、あなたの現在のアプローチが漏れているということです。基本的に異なるタイプは、派生したクラスの実装の詳細です。これらのクラスのユーザーは、その型を適切に扱うためには、その型がわかっている必要があります。私にとっては、これはカプセル化を破っており、C++はプログラマから型の知識を隠し、実際にコンパイラに知ってもらい、この漏れを回避する仕組みを提供しています。

あなたがしようとしていることについての詳細がなければ、代替アプローチについての示唆を与えるのは難しいです。私はあなたの問題にきちんと対処する代替設計があると確信していますが、今はこれがXYの問題です。

+0

あなたが私の現在のアイデアで閉ざされていて、違うより適したアイデアを開くことができるのを助けます。ありがとう! –

+0

また、ジェネリックスとテンプレートの洞察に感謝します! –

+0

@FedericoAllocati問題はありません。私は、C++からC#開発に移行する多くの開発者と協力しています。ジェネリックスとテンプレートは、固執するポイントの1つです。 C#での開発はC++とはまったく異なります。パターンを互いに入れ替えようとするのが一般的ですが、それはほとんどの場合間違いです(通常はここでは不可能です)。 – Kyle

関連する問題