Я хочу иметь 2d векторных классов для каждого примитивного типа.
Прямо сейчас, чтобы обеспечить наилучшую производительность во время выполнения и иметь возможность использовать многие служебные функции, мне нужно иметь отдельный класс для каждого примитива (Vector2Int, Vector2Float, Vector2Long и т.д.).
Это просто много копирование, и если мне нужно внести изменения, я должен помнить, чтобы делать это в каждом классе и в каждой функции полезности.
Есть ли что-нибудь, что позволяет мне писать что-то вроде шаблонов С++ (или есть ли способ создать его)?
Я создал небольшую концепцию, чтобы показать вам, как это будет работать:
// 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
}
}
*/
Есть ли какой-нибудь умный способ реализовать это, или это совершенно невозможно?
Извините, что я не очень ясен, но позвольте мне объяснить, в чем проблема.
Рассмотрим использование обычных генераторов С#. Метод GetLength() не будет компилироваться, потому что все типы, которые я хочу использовать (int, float, double, long), требуют совместного использования интерфейса, который Math.Pow() должен принимать как параметр.
Буквально подставляя токен "T" с именами типов, это решило бы эту проблему, увеличило бы гибкость, обеспечило бы производительность рукописного кода и ускорило бы развитие.
Я создал свой собственный генератор шаблонов, который генерирует код С#, написав код С#:) http://www.youtube.com/watch?v=Uz868MuVvTY