我移植一个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