我在C#中創建了一個線性代數庫,並且我想強制維度不一致性錯誤直至編譯時。我已經實現了類似this的解決方案,其中我使用的特徵是一個唯一映射到整數的類。問題在於我希望我的矢量具有所有可能的大小,我需要創建一個具有唯一名稱的類來表示它。在編譯時向量數學維一致性檢查
這裏是一個實現的例子:
public class Vector<T> where T: ISize, new()
{
static readonly T size = new T();
List<double> values;
public Vector(List<double> values)
{
if (values.Count != size.Size)
throw new IndexOutOfRangeException();
this.values = new List<double>(values);
}
public double Get(int index)
{
return values[index];
}
public Vector<T> Add(Vector<T> other)
{
var vv = new List<double>();
for (int ii = 0; ii < size.Size; ++ii)
vv.Add(other.Get(ii) + this.values[ii]);
return new Vector<T>(vv);
}
}
public interface ISize
{
int Size { get; }
}
public class S1 : ISize
{
public int Size
{
get { return 1; }
}
}
public class S2 : ISize
{
public int Size
{
get { return 2; }
}
}
下面是它的用法的例子:
class Program
{
static void Main(string[] args)
{
var v1 = new Vector<S2>(new List<double>() { 1, 2 });
var v2 = new Vector<S2>(new List<double>() { 10, -4 });
var z1 = new Vector<S1>(new List<double>() { 10 });
// works
var v3 = v1.Add(v2);
// complie-time error
var z2 = z1.Add(v1);
}
}
這工作得很好,我的目的,除了一個事實,我需要爲每個可能的Vector大小創建一個不同的ISize實現。有沒有什麼辦法可以讓我實現Vector類,以便讓我解決這個問題?
沒有C++等價於「非類型模板參數」,我不認爲這是可能的。 – 2014-12-03 21:35:22