Giả sử nếu tôi có điều này,Quy tắc xác định tập hợp loại chức năng tương thích với std :: function <R(T1,T2)>?
std::function<int(int,int)> fs;
thì làm sao tôi có thể xác định tập hợp các hàm (hoặc đối tượng chức năng) mà fs
có thể được khởi tạo với?
nào của folllowing được phép và không:
std::function<int(int,int)> fs = [](int, int) { return int(10); };
std::function<int(int,int)> fs = [](char, char) { return char(10); };
std::function<int(int,int)> fs = [](int, short) { return int(10); };
std::function<int(int,int)> fs = [](double, int) { return float(10); };
std::function<int(int,int)> fs = [](int, wchar_t) { return wchar_t(10); };
std::function<int(int,int)> fs = [](const char*, int){ return "string"; };
std::function<int(int,int)> fs = [](const char*, int){ return 10; };
std::function<int(int,int)> fs = [](const char*, int){ return std::string(); };
Tất nhiên, tôi có thể biên dịch và xem cái nào biên dịch tốt, và đó không. Nhưng điều đó không giúp tôi hiểu các biến thể trong các loại tham số và kiểu trả về. Làm thế nào đến nay tôi có thể sử dụng các loại khác nhau cho họ?
Nói cách khác, nếu tôi đã đưa ra một hàm (hoặc đối tượng hàm), làm thế nào tôi có thể xác định tại thời gian biên dịch nếu nó tương thích với std::function<int(int,int)>
hay không? Tôi ít hiểu, nhưng tôi không đủ tự tin.
Vì vậy, hãy giúp tôi hiểu và đặt ra các quy tắc để xác định tập hợp loại chức năng tương thích với std::function<R(T1,T2)>
? Metaprogramming có thể giúp tôi ở đây để thông báo cho người dùng, tạo ra các thông báo lỗi hay không, nếu họ sử dụng chức năng không tương thích?
Bằng cách này, nhóm đầu tiên có vẻ là tương thích: http://ideone.com/hJpG3
Có vẻ như câu trả lời này nằm trong ngữ cảnh chức năng mà Thư viện chuẩn đưa ra ... nếu câu trả lời của tôi không chính xác, bạn có thể nhận xét về lý do không? Chỉnh sửa - đặc điểm này dường như bỏ qua việc chuyển đổi giá trị trả về… – Potatoswatter
@Potatoswatter: Tôi vừa xem xét việc thực hiện các đặc điểm này. Chúng phụ thuộc vào 'std :: forward',' std :: is_convertible' và 'std :: is_same'. Chúng có thể được thực hiện như một phần của std :: lib hay không.Tôi cũng đã xem xét câu trả lời của tôi và không thấy nơi tôi ngụ ý rằng câu trả lời của bạn không chính xác. Câu trả lời của tôi chỉ đơn giản là cung cấp việc thực hiện lập trình meta cho các phần mà bạn đề cập đến. OP hỏi về một giải pháp lập trình meta, vì vậy tôi nghĩ câu trả lời của tôi có liên quan. Về việc chuyển đổi giá trị trả về: Điều này được bao hàm trong '__callable' bằng cách sử dụng' __invoke_of' và 'is_convertible'. –
OK. Sự bất đồng duy nhất sẽ là tôi xem xét câu trả lời của tôi là "câu trả lời chuẩn được đóng gói sẵn". Đối với chuyển đổi kiểu trả về, tôi đã không theo liên kết và giả định nó là một mẫu không phải là thành viên, không có quyền truy cập vào kiểu trả về mong muốn. Ở cấp độ người dùng, không phải là 'std :: is_convertible :: type, R> :: value' đủ? Tôi đoán nó phụ thuộc nếu bạn muốn SFINAE hoặc kết quả 'sai'. –
Potatoswatter