2015-07-05 63 views
6

Tôi đang cố gắng để chuyển đổi mã này # C đến C++:C# C++ 11 chuyển đổi: mẫu đại biểu

public delegate void Action<in T>(T obj); 
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2); 
public delegate void Action<in T1, in T2, in T3>(T1 arg1, T2 arg2, T3 arg3); 

Khá rõ ràng này đòi hỏi std :: chức năng. Do đây là một dự án lớn hơn tôi đã sử dụng một công cụ để làm tất cả những chuyển đổi và đây là những gì nó đã đưa ra:

#include <functional> 

    template<typename T> 
//C# TO C++ CONVERTER TODO TASK: C++ does not allow specifying covariance or contravariance in a generic type list: 
//ORIGINAL LINE: public delegate void System::Action<in T>(T obj); 
    using std::function<void()> = std::function<void (T obj)>; 

    template<typename T1, typename T2> 
//C# TO C++ CONVERTER TODO TASK: C++ does not allow specifying covariance or contravariance in a generic type list: 
//ORIGINAL LINE: public delegate void System::Action<in T1, in T2>(T1 arg1, T2 arg2); 
    using std::function<void()> = std::function<void (T1 arg1, T2 arg2)>; 

    template<typename T1, typename T2, typename T3> 
//C# TO C++ CONVERTER TODO TASK: C++ does not allow specifying covariance or contravariance in a generic type list: 
//ORIGINAL LINE: public delegate void System::Action<in T1, in T2, in T3>(T1 arg1, T2 arg2, T3 arg3); 
    using std::function<void()> = std::function<void (T1 arg1, T2 arg2, T3 arg3)>; 

tôi cho rằng sử dụng std::function<void()> là một lỗi dịch thuật, vì vậy tôi đã thay đổi họ Action. Vì vậy, phiên bản cuối cùng của tôi là:

template<typename T> 
using Action = std::function<void(T obj)>; 

template<typename T1, typename T2> 
using Action = std::function<void(T1 arg1, T2 arg2)>; 

template<typename T1, typename T2, typename T3> 
using Action = std::function<void(T1 arg1, T2 arg2, T3 arg3)>; 

Nhưng điều này không biên dịch, với lỗi có thể hiểu được Hành động đã được xác định (khi đến dòng thứ hai). Tuy nhiên, có khả năng có các hàm mẫu với các tình trạng quá tải (cùng tên, các tham số mẫu khác nhau), vì vậy tôi tự hỏi tại sao điều này không làm việc cho các mẫu bí danh của tôi. Nó chỉ đơn giản là không được hỗ trợ hoặc tôi bỏ lỡ một cái gì đó? Ngoài ra, có lẽ tôi không hoàn toàn hiểu được đồng và contravariance, nhưng theo ý kiến ​​của tôi họ không áp dụng cho vấn đề này (không có loại thừa kế liên quan ở đây), vì vậy tôi không thấy những gì công cụ chuyển đổi muốn nói với tôi bởi những nhận xét này.

+2

Bằng cách sử dụng từ khóa 'using' theo cách bạn làm, bạn tạo bí danh của một loại và C++ không cho phép loại quá tải (tức là bạn không thể có hai loại khác nhau có cùng tên). Có thể giải quyết với [gói tham số mẫu] (http://en.cppreference.com/w/cpp/language/parameter_pack)? –

+0

@ JoachimPileborg, gợi ý của bạn hoàn toàn chạm vào móng trên đầu. Giải pháp là: 'template sử dụng Action = std :: function ;'. Bạn có thể gửi gợi ý của bạn như là câu trả lời, vì vậy tôi có thể chấp nhận nó và đánh giá điểm? –

+4

Sẽ là điều thú vị tại sao mọi người downvote một câu hỏi hoàn toàn hợp lệ và tốt, mà không cần phải quan tâm giải thích tại sao. Nếu thiếu hiểu biết là một tiêu chuẩn để bỏ phiếu, tất cả các câu hỏi tại SO sẽ có số phiếu bầu âm. –

Trả lời

1

JoachimPilebord không muốn trả lời, vì vậy tôi làm điều đó để hoàn thành. Giải pháp là sử dụng số template parameter pack như sau:

template<typename ... Ts> 
using Action = std::function < void(Ts...) >; 

cho phép xác định hàm gọi lại với bất kỳ số tham số nào. Yould có thể làm tương tự với std :: bind, nhưng theo cách này, mã sẽ sạch hơn và dễ đọc hơn.