2013-05-06 23 views
9

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 Fint(*)(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?

Trả lời

12

F là con trỏ để hoạt động (bất kể bạn có vượt qua f hoặc &f) hay không. Vì vậy, loại bỏ các con trỏ:

std::is_function<typename std::remove_pointer<F>::type>::value 

(Trớ trêu thay, std::is_function<std::function<FT>> == false ;-))

+2

Tôi ghét chuyển đổi tiềm ẩn :( –

+5

* "(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). –

+0

@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. –

Các vấn đề liên quan