C++ cho phép các tham số mẫu không phải là con trỏ, bao gồm cả con trỏ hàm, kiểu. Gần đây, tôi đã yêu cầu một số question về điều này hữu ích và đây là theo dõi one of the answers.Có cách nào để suy ra giá trị của tham số mẫu con trỏ hàm không?
Có thể suy ra giá trị của tham số mẫu con trỏ hàm, từ đối số hàm là con trỏ hàm được đề cập không? Ví dụ:
using VoidFunction = void(*)();
template <VoidFunction F>
void templ(VoidFunction);
...
void func(); // a VoidFunction
...
templ<func>(func); // works, but I have to specify the template parameter explicitly
templ(func); // <-- I would like to be able to do this
Có cách nào để nhận khoản khấu trừ này xảy ra không? Có vẻ như về mặt kỹ thuật có thể từ quan điểm của người triển khai trình biên dịch, miễn là đối số hàm có thể được giải quyết thành một hàm trong mã tại thời gian biên dịch.
Nếu bạn đang băn khoăn về động lực đằng sau điều này, hãy xem các nhận xét dưới this answer, đặc biệt là tối ưu hóa có thể có để thực hiện std::bind()
.
EDIT: Tôi nhận thấy rằng tôi có thể chỉ cần xóa đối số hàm và sử dụng đối số mẫu, như trong templ<func>()
. Mục đích duy nhất của tôi về việc thêm vào đối số hàm là cố gắng tránh phải vượt qua đối số mẫu.
Tôi đoán những gì tôi thực sự muốn, cũng là để suy ra loại của con trỏ hàm, như trong:
template <typename Function, Function F>
void templ(/* something */);
và sau đó có thể gọi
templ(func);
hoặc
templ<func>();
và có cả loại và giá trị được suy ra từ một bài hát e đề cập đến con trỏ hàm.
Hy vọng bây giờ có ý nghĩa hơn.
Làm thế nào nó có thể suy ra nó? Ví dụ, tôi có thể làm điều này: 'template void foo (std :: size_t i) {int arr [N];/* fill */return arr [i];} '. Tôi chắc chắn sẽ muốn một lỗi nếu tôi đã xảy ra để quên các đối số mẫu khi khấu trừ này có thể được thực hiện. –
chris
Nghĩ về nó, tôi không chắc tôi hiểu tại sao nó cần phải được thông qua như một đối số chức năng. Không phải là 'templ(); 'đủ? –
chris
@chris: Phải, câu hỏi của tôi không có ý nghĩa nhiều như được viết :) Vui lòng xem chỉnh sửa của tôi. – HighCommander4