2010-09-22 57 views
6

Có thể sử dụng loại hàm được khai báo trước như một con trỏ hàm mà không sử dụng một typedef không?con trỏ hàm không có typedef

khai báo hàm:

int myfunc(float); 

sử dụng khai báo hàm của một số cú pháp như con trỏ hàm

myfunc* ptrWithSameTypeAsMyFunc = 0; 
+0

Bạn muốn có một con trỏ hàm chỉ có thể trỏ đến hàm delcared của riêng bạn? – wheaties

+0

@wheaties Tôi muốn một con trỏ hàm đến một hàm có cùng chữ ký với myfunc –

+1

Bạn có biết bạn có thể áp dụng 'typedef' cho các khai báo hàm để gõ vào kiểu của chúng không? 'typedef int myfunc (float); myfunc * ptrWithSameTypeAsMyFunc = 0; '? Hầu hết mọi người không nhận thức được điều này và nghĩ rằng họ cần cú pháp '(* foo)' xấu xí. –

Trả lời

20

Không theo tiêu chuẩn năm 2003. Vâng, với tiêu chuẩn C++ 0x sắp tới và MSVC 2010 và g ++ 4.5:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0; 
+0

có vẻ đẹp - sẽ kiểm tra điều này ... –

+0

vấn đề là mã của tôi không biên dịch với C++ 0x được kích hoạt. Vì vậy, đây không phải là giải pháp có thể sử dụng cho tôi: S –

+0

Với g ++, bạn có thể sử dụng 'typeof (myfunc)' thay vì 'decltype (myfunc)' và nó hoạt động ngay cả trong chế độ không phải C++ 0x. –

6

Vâng, chúng ta có thể khai báo một con trỏ hàm mà không có một typedef, nhưng không có nó không phải là có thể sử dụng tên của một để làm điều đó.

typedef thường được sử dụng vì cú pháp để khai báo một con trỏ hàm là một baroque bit. Tuy nhiên, typedef là không cần thiết. Bạn có thể viết:

int (*ptr)(float); 

tuyên bố ptr như một con trỏ hàm để một chức năng chụp float và trở int - không typedef được tham gia. Nhưng một lần nữa, không có cú pháp nào cho phép bạn sử dụng tên myfunc để thực hiện việc này.

0
int (*ptrWithSameTypeAsMyFunc)(float) = 0; 

Xem here để biết thêm thông tin cơ bản.

1

Không, không phải tại thời điểm hiện tại. C++ 0x sẽ thay đổi ý nghĩa của auto và thêm từ khóa mới decltype cho phép bạn thực hiện những việc như thế này. Nếu bạn đang sử dụng gcc/g ++, bạn cũng có thể xem xét sử dụng toán tử typeof của nó, điều này khá giống nhau (có sự khác biệt tinh tế khi xử lý các tham chiếu).

1

Không, không phải không có C++ 0x decltype:

int myfunc(float) 
{ 
    return 0; 
} 

int main() 
{ 
    decltype (myfunc) * ptr = myfunc; 
} 
1

gcc có typeof như một phần mở rộng cho C (không biết về C++) (http://gcc.gnu.org/onlinedocs/gcc/Typeof.html).

int myfunc(float); 

int main(void) { 
    typeof(myfunc) *ptrWithSameTypeAsMyFunc; 
    ptrWithSameTypeAsMyFunc = NULL; 
    return 0; 
} 
+4

GCC không cần phần mở rộng 'typeof' trong C++ vì nó triển khai thực hiện' decltype' (sắp được tiêu chuẩn), phục vụ khá nhiều mục đích tương tự. – MSalters

3

Có posible để sử dụng các loại của một hàm prefiously khai báo là một con trỏ hàm mà không sử dụng typedef?

Tôi sẽ để lừa một chút

template<typename T> 
void f(T *f) { 
    T* ptrWithSameTypeAsMyFunc = 0; 
} 

f(&myfunc); 

Tất nhiên, đây không phải là hoàn toàn không có cạm bẫy: Nó sử dụng các chức năng, vì vậy nó phải được xác định, trong khi những thứ như decltype không sử dụng chức năng và không yêu cầu hàm được xác định.

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