すべてのプリミティブ型に 2 次元ベクトル クラスが必要です。
現在、最高のランタイム パフォーマンスを保証し、多くのユーティリティ関数を使用できるようにするために、プリミティブ (Vector2Int、Vector2Float、Vector2Long など) ごとに個別のクラスを用意する必要があります。
コピーと貼り付けを繰り返すだけで、変更が必要な場合は、すべてのクラスとすべてのユーティリティ関数で忘れずに変更する必要があります。
C++ テンプレートのようなものを作成できるものはありますか (または作成する方法はありますか)?
これがどのように機能するかを示すために、小さな概念を作成しました。
// compile is a keyword I just invented for compile-time generics/templates
class Vector2<T> compile T : int, float, double, long, string
{
public T X { get; set; }
public T Y { get; set; }
public T GetLength()
{
return Math.Sqrt(Math.Pow(X, 2) + Math.Pow(Y, 2));
}
}
// during compilation, code will be automatically generated
// as if someone manually replaced T with the types specified after "compile T : "
/*
VALID EXAMPLE (no compilation errors):
autogenerated class Vector2<int>
{
public int X { get; set; }
public int Y { get; set; }
public int GetLength()
{
return Math.Sqrt(Math.Pow(X, 2) + Math.Pow(Y, 2));
}
}
UNVALID EXAMPLE (build failed, compilation errors):
autogenerated class Vector2<string>
{
public string { get; set; } // ok
public string { get; set; } // ok
public string GetLength()
{
return Math.Sqrt(Math.Pow(X, 2) + Math.Pow(Y, 2)); // error! string cannot be used with Math.Pow()
// and Math.Sqrt doesn't accept string type
}
}
*/
これを実装する賢い方法はありますか、それとも完全に不可能ですか?
分かりづらくて申し訳ありませんが、何が問題なのか説明させてください。
通常の C# ジェネリックの使用を検討してください。GetLength() メソッドはコンパイルされません。これは、使用するすべての型 (int、float、double、long) が、Math.Pow() がパラメーターとして受け入れる必要があるインターフェイスを共有する必要があるためです。
「T」トークンを文字通り型名に置き換えると、この問題が解決され、柔軟性が向上し、手書きコードのパフォーマンスが達成され、開発がスピードアップします。
C#コードを書くことでC#コードを生成する独自のテンプレートジェネレーターを作成しました:) http://www.youtube.com/watch?v=Uz868MuVvTY