我移植一個C++應用程序到C#,並已跨越模板運行。我已經閱讀了一些關於這些的文章,並且我明白一些模板類似於.Net泛型。我讀了SO answer這個案例,很好地總結了它。移植C++到C# - 模板
但是,似乎的C++模板某些用途不直接相關的仿製藥。在以下來自維基百科的Template metaprogramming文章的示例中,模板似乎接受一個值,而不是一個類型。我不太確定這將如何移植到C#?
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0>
{
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
int x = Factorial<4>::value; // == 24
int y = Factorial<0>::value; // == 1
}
顯然,在這個例子中我可以這樣做:
public int Factorial(int N){
if(N == 0) return 1;
return Factorial(N - 1);
}
,但這對我來說似乎是一個重構的功能,而不是一個端口,以語義相似的代碼。
爲什麼你會使用經典的遞歸函數作爲c#泛型?嘗試閱讀這篇文章http://msdn.microsoft.com/en-us/library/bb549151.aspx使用Func –
nemke
2011-01-19 13:37:08
這個問題最有可能不會與常量(類型)作爲模板參數,但與如果目前在您的代碼庫中使用了類或函數的特化和部分特化。沒有一些特定的例子,答案將需要很廣泛,可能不是很有用。由於這個原因,我正在投票結束,隨時添加關於您在轉換時遇到問題的部分代碼的具體問題。 – 2011-01-19 13:38:57
@nemke - 在本例中,Factorial模板在編譯時展開 - 因此在運行時實際上沒有工作。 OP希望移植代碼,而不必將太多的代碼翻譯成不同類型的C#調用 - 所以如果可能的話,更喜歡基於通用的解決方案。不幸的是,事實並非如此。 @David - 非常好的點也 – 2011-01-19 13:40:17