Delphiで新機能です。私の会社が必要とするプロジェクトでは、既存のC++クラスのコードをDelphiに変換する必要があります。これらのクラスの一部は次のようなテンプレートです:デルファイのジェネリック型での算術演算
template <class T>
struct APoint
{
T m_X;
T m_Y;
virtual void Add(T value);
};
template <class T>
void APoint<T>::Add(T value)
{
m_X += value;
m_Y += value;
}
私はそれを使用します。このコードで
これはうまくいきます。
これで、Delphiの同等のコードを記述する必要があります。上記のC++コードに基づいて、Delphi Genericクラスを作成しようとしました。
ただし、このコードはコンパイルされません。私はこのエラーを取得する:このコードは私の知る限り
E2015 Operator not applicable to this operand type
は動作するはずです、と私はそれと間違っているかを理解していません。誰にでも私に説明することができます:
なぜこのようなコードはDelphiでコンパイルされませんか?
Add()
関数を提供するテンプレートクラスを作成するための正しい(最も単純な)方法は、C++コードと上記の使用法に可能な限り近いものですか?
は2016年10月17日にすべての返信用
感謝を編集しました。だから私が正しく理解していれば、DelphiはC++には存在しないいくつかの制約を課しているので、C++スタイルのテンプレートを作成する方法はありません。
これに基づいて、私が望む目的に到達するための回避策を探しました。私は以下の解決策を見つけました:
IPoint<T> = interface
procedure Add(value: T);
end;
APoint<T> = class(TInterfacedObject, IPoint<T>)
m_X: T;
m_Y: T;
procedure Add(value: T); virtual; abstract;
end;
APointF = class(APoint<Single>)
destructor Destroy; override;
procedure Add(value: Single); reintroduce;
end;
destructor APointF.Destroy;
begin
inherited Destroy;
end;
procedure APointF.Add(value: Single);
begin
m_X := m_X + value;
m_Y := m_Y + value;
end;
私はそれを使用します。このコードで
procedure AddPoint;
var
pt: IPoint<Single>;
begin
pt := APointF.Create;
APointF(pt).m_X := 2.0;
APointF(pt).m_Y := 4.0;
APointF(pt).Add(5.0);
end;
これはうまくいきます。しかし、私は少し重いスタイルを見つける。 APointF(pt)を使用する必要性。上記のコードに関して、私の質問は次のとおりです。
- このソリューションは良い解決策ですか? (例:APointF、APointI、APointD、...のように、サポートしたいタイプごとに各レコードのバージョンを書く方が良い)
- このコードを簡略化する方法はありますか? APointF(pt)変換なしで直接pt.m_Xを呼び出すソリューションですか? (注変数に直接アクセスするよりもエレガントだと思っても、プロパティの実装は省略しました)
- このソリューションのパフォーマンスはどうですか? (つまり、このソリューションは、直接m_X:= m_X +値の加算よりも大幅に遅くなりますか?
function APoint<T>.IsEqual(const other: APoint<T>): Boolean; var comparer: IEqualityComparer<T>; begin Result := (comparer.Equals(m_X, other.m_X) and comparer.Equals(m_Y, other.m_Y)); end;
私は、シーンの背後にあるコードを読み取ろうとしました。)
最後に、私はこの方法2つのジェネリック型の等価比較を実現することが可能であるDelphiコード、内の別の解決策を見てしかし、私はそれがひどく複雑であることが分かった。だから、私の質問は次の通りです:
- このような解決法は、上記の解決策よりも優れていますか?
- すぐに使用できる、数学的操作のためのソリューションはありますか?
- このようなソリューションのパフォーマンスは受け入れられますか?
ご回答を事前に感謝
よろしく
[ジェネリックス制約](http://docwiki.embarcadero.com/RADStudio/ja/Constraints_in_Generics)は、定規も浮動小数点も定義できません。これは、すべての 'T 'に算術演算子がないので、ここで見ているものです。 –
いくつかのテストは、ジェネリックスと算術演算子でここで行われました:https://delphihaven.wordpress.com/2011/03/18/generic-arithmetic/。 –
*デルファイのジェネリックスは、C++のテンプレートやC#のジェネリック型とは異なります。特に、型パラメータは、Integer、Double、Stringなどの特定の単純型に制約することはできません。 http://docwiki.embarcadero.com/RADStudio/en/Overloads_and_Type_Compatibility_in_Generics) –