Tôi đang tìm các quy tắc liên quan đến việc chuyển các hàm mẫu C ++ làm đối số.
Điều này được hỗ trợ bởi C ++ như được hiển thị bằng một ví dụ ở đây:
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
Học về kỹ thuật này là khó, tuy nhiên. Googling cho "chức năng như một đối số mẫu" không dẫn đến nhiều. Và các mẫu C ++ cổ điển Hướng dẫn hoàn chỉnh đáng ngạc nhiên cũng không thảo luận về nó (ít nhất là không phải từ tìm kiếm của tôi).
Các câu hỏi tôi có là liệu đây có phải là C ++ hợp lệ không (hoặc chỉ là một số tiện ích mở rộng được hỗ trợ rộng rãi).
Ngoài ra, có cách nào để cho phép một functor có cùng chữ ký được sử dụng thay thế cho nhau với các hàm rõ ràng trong kiểu gọi mẫu này không?
Phần sau không hoạt động trong chương trình trên, ít nhất là trong Visual C ++ , vì cú pháp rõ ràng là sai. Thật tuyệt khi có thể chuyển đổi một hàm cho functor và ngược lại, tương tự như cách bạn có thể chuyển một con trỏ hàm hoặc functor cho thuật toán std :: sort nếu bạn muốn xác định một hoạt động so sánh tùy chỉnh.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Con trỏ đến một hoặc hai liên kết web hoặc một trang trong sách Mẫu C ++ sẽ được đánh giá cao!
-std=gnu++17
. Tôi có thể sử dụng kết quả của toán tử chuyển đổi lambda constexpr không bị giam giữ C ++ 17 làm đối số kiểu con trỏ hàm không? .