tôi đi qua một con trỏ đến chức năng vào một hàm template:std :: is_function không công nhận lập luận mẫu như chức năng
int f(int a) { return a+1; }
template<typename F>
void use(F f) {
static_assert(std::is_function<F>::value, "Function required");
}
int main() {
use(&f); // Plain f does not work either.
}
Nhưng lập luận mẫu F
không được công nhận bởi is_function
là một chức năng và các tĩnh xác nhận không thành công. Thông báo lỗi trình biên dịch cho biết rằng F
là int(*)(int)
là con trỏ để hoạt động. Tại sao nó cư xử như thế? Làm thế nào tôi có thể nhận ra hàm hoặc con trỏ để hoạt động trong trường hợp này?
Tôi ghét chuyển đổi tiềm ẩn :( –
* "(Trớ trêu thay,' std :: is_function> == false ';-))" * - Có thể cho các tiêu chuẩn tương lai 'std :: is_callable' có thể là một ý tưởng hay, vì' std :: is_function' thậm chí không hoạt động đối với lambdas, chỉ các hàm đơn giản (và các lần có thể gọi là một chức năng là cách trên trong C + + hiện đại). –
@ChristianRau 'std :: is_function' là một trong những đặc điểm phân loại chính. 'is_callable' hoặc bất cứ thứ gì giống như vậy sẽ phục vụ cho một mục đích hoàn toàn khác nhau. –