2012-02-05 29 views
5

Tôi đã tự hỏi liệu có ai biết giới hạn trên toán tử chuyển đổi/typecast không?Có bất kỳ giới hạn nào về các loại trong toán tử định kiểu không?

Vì vậy, ví dụ, tôi có thể có các nhà khai thác ghi đè sau:

class Test { 
    operator int() { return 0; }; 
    operator int*() { return nullptr; }; 
} 

Đối với một chức năng thường xuyên, tôi cũng có thể có một con trỏ đến kiểu mảng. Ví dụ.

int (*MyFunc())[4] { return nullptr; }; 

Tuy nhiên, tôi không biết cách làm tương tự cho nhà điều hành chuyển đổi (hoặc nếu điều này là hợp pháp). Tôi đã thử một vài biến thể khác nhau và VS2010 và không hoạt động. (Chẳng hạn như :)

operator int (*())[4] { return nullptr; }; 
operator int(*)[4]() { return nullptr; }; 

Tôi không chắc chắn đây có phải là giới hạn trong VS2010 hoặc nếu có giới hạn chung về các loại có thể được sử dụng trong toán tử chuyển đổi. Tôi đã cố gắng tìm kiếm tiêu chuẩn trực tuyến mà không có may mắn. Có ai biết không? Trước khi bất cứ ai hỏi "tại sao bạn thậm chí muốn làm điều đó", đó là mã được tạo tự động. Mặc dù tôi không lường trước được con trỏ tới đầu vào mảng, nhưng tôi muốn có thể tạo mã nếu nó là hợp pháp trong C++.

Trả lời

3

Vâng, có những hạn chế. Giới hạn mà bạn gặp phải với mảng là do ngữ pháp ngôn ngữ. Các đặc điểm kỹ thuật ngữ pháp cho một nhà điều hành chuyển đổi (và thân nhân) như sau:

 
§12.3.2 
conversion-function-id: 
    operator conversion-type-id 
conversion-type-id: 
    type-specifier-seq conversion-declarator[opt] 
conversion-declarator: 
    ptr-operator conversion-declarator[opt] 

§7.1.6 
type-specifier: 
    trailing-type-specifier 
    class-specifier 
    enum-specifier 
trailing-type-specifier: 
    simple-type-specifier 
    elaborated-type-specifier 
    typename-specifier 
    cv-qualifier 
type-specifier-seq: 
    type-specifier attribute-specifier-seq[opt] 
    type-specifier type-specifier-seq 
trailing-type-specifier-seq: 
    trailing-type-specifier attribute-specifier-seq[opt] 
    trailing-type-specifier trailing-type-specifier-seq 

tôi để lại nó như một bài tập cho người đọc nhìn vào tất cả những người, nhưng bạn không thể chỉ định một mảng như các loại trực tiếp. (. Nó chỉ được quy định tại tờ khai) May mắn thay, tuy nhiên, một typedef tên tuổi được phép (thông qua typename-specifier), và bởi vì một typedef là một loại tờ khai, mảng làm việc ở đó:

struct Test { 
    typedef int operator_type[4]; 

    operator operator_type*() { return nullptr; }; 
}; 

Câu chuyện dài ngắn, sử dụng typedef và bạn có thể sử dụng bất kỳ loại nào bạn muốn.

+0

Cảm ơn. Đó là câu trả lời chính xác câu hỏi của tôi. –

+0

Nhận xét của Downvote? – GManNickG

6

Bạn chủ yếu nên sử dụng typedef trong cấu trúc cứng, bạn cũng có cú pháp sai,

operator Type() {}

Tôi sẽ sử dụng typedef s mặc dù

typedef int (*foo())[4]; 
typedef int(*bar)[4]; 

sử dụng typedef

operator foo() { return nullptr; } // tại đây bạn đang cố gắng chuyển đổi nullptr đến "chức năng" trả về con trỏ tới mảng của 4 int, điều này rõ ràng là sai.

operator bar() { return nullptr; } // chuyển đổi thứ hai của bạn là hợp lệ mặc dù, kể từ khi bạn đang chuyển đổi nullptr để con trỏ để mảng của 4 int s

+0

Vâng, tôi đã hy vọng tránh sử dụng typedef nhưng tôi đoán không có sự lựa chọn. –

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