【发布时间】:2011-01-19 13:34:19
【问题描述】:
我正在将 C++ 应用程序移植到 C#,并且已经跨模板运行。我已经阅读了一些关于这些的内容,并且我了解某些模板类似于 .Net 泛型。我阅读了这个案例的SO answer,它很好地总结了它。
但是,c++ 模板的某些用途似乎与泛型没有直接关系。在下面来自 Wikipedia 的 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# 泛型?尝试阅读这篇文章msdn.microsoft.com/en-us/library/bb549151.aspx 了解 Func
的用法 -
问题很可能不在于常量(与类型)作为模板的参数,而在于类或函数的特化和部分特化(如果它们当前在您的代码库中使用)。如果没有一些特定的例子,答案将需要广泛,并且可能不是真的有用。出于这个原因,我投票结束,请随意添加有关您在转换时遇到问题的某些代码的具体问题。
-
@nemke - 在此示例中,Factorial 模板在编译时展开 - 因此在运行时实际上没有完成任何工作。 OP 希望移植代码而不必将太多转换为不同类型的 C# 调用 - 所以如果可能的话,更喜欢基于泛型的解决方案。不幸的是,事实并非如此。 @David - 也很好
-
顺便说一句,语义递归函数和模板执行相同的操作,它们的不同之处在于实现:模板被解析为编译时并扩展为常量,而等效的 C# 代码在运行时执行。无论如何,这可能是你现在能做的最好的翻译。但这只是一个玩具示例...
标签: c# .net c++ templates porting