Tôi đang chuyển một ứng dụng C++ sang C# và đã chạy trên các mẫu. Tôi đã đọc lên một chút về những điều này, và tôi hiểu rằng một số mẫu giống như .Net generics. Tôi đọc số SO answer đối với trường hợp này đã tóm tắt nó một cách hợp lý.Porting C++ to C# - templates
Tuy nhiên, một số cách sử dụng khuôn mẫu C++ dường như không liên quan trực tiếp đến Generics. Trong ví dụ dưới đây từ bài viết Template metaprogramming của Wikipedia, mẫu có vẻ chấp nhận một giá trị, chứ không phải là một loại. Tôi không hoàn toàn chắc chắn làm thế nào điều này sẽ được chuyển đến 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
}
Rõ ràng ví dụ này tôi có thể làm:
public int Factorial(int N){
if(N == 0) return 1;
return Factorial(N - 1);
}
nhưng điều này dường như tôi trở thành một refactoring để một chức năng, chứ không phải là một cổng để mã ngữ nghĩa tương tự.
Tại sao bạn sẽ sử dụng chức năng đệ quy cổ điển như một C# generics? Hãy thử đọc bài viết này http://msdn.microsoft.com/en-us/library/bb549151.aspx để sử dụng Func –
nemke
Vấn đề có thể sẽ không được với hằng số (so với các loại) làm tham số cho mẫu, nhưng với chuyên môn hóa và chuyên môn hóa một phần các lớp hoặc chức năng nếu chúng hiện đang được sử dụng trong cơ sở mã của bạn. Nếu không có một số ví dụ cụ thể, câu trả lời sẽ cần phải rộng và có thể không thực sự hữu ích. Tôi bỏ phiếu để đóng vì lý do đó, cảm thấy tự do để thêm câu hỏi cụ thể về một số đoạn mã mà bạn có vấn đề chuyển đổi. –
@nemke - Trong ví dụ này, mẫu Factorial mở rộng tại thời gian biên dịch - do đó không có công việc nào thực sự được thực hiện trong thời gian chạy. OP muốn chuyển mã mà không cần phải dịch quá nhiều vào các loại C# khác nhau - vì vậy sẽ thích giải pháp dựa trên chung hơn nếu có thể. Thật không may, nó không phải. @David - điểm rất tốt quá –