2009-07-26 28 views
7

Trong một số mã C++, tôi sử dụng số nguyên để lưu trữ nhiều dữ liệu thay đổi. Để phân tích chương trình của tôi, tôi muốn ghi lại các thay đổi nhất định đối với một số biến, chẳng hạn như tần suất một giá trị nhất định được gán và tần suất chuyển nhượng thừa (giá trị mới giống như giá trị cũ.)C++ xuất phát từ kiểu gốc

Nếu loại là một lớp Foo, tôi chỉ lấy được một LoggingFoo mới và thêm dữ liệu ghi nhật ký của tôi vào (các) hàm thành viên mà tôi quan tâm và sau đó gọi hàm thành viên chính. Tôi phải cập nhật mã của mình để sử dụng loại mới, nhưng miễn là tôi ban đầu phù hợp với typedef, đó là thay đổi một dòng.

Vấn đề của tôi là biến tôi muốn thêm đăng nhập vào là int. Bạn không thể lấy được từ các loại được xây dựng trong C++ (có thể bạn?)

Câu hỏi của tôi là liệu có một cách thông minh để lấy được từ các loại cơ bản (int, float, double, etc).

Các giải pháp có thể định nghĩa một lớp mới mà hiệu quả là một int .. nó định nghĩa mỗi hoạt động một int có thể làm và chỉ áp dụng cho hoạt động đó cho một thành viên int dữ liệu cá nhân. Chiến lược này sẽ hoạt động, nhưng có lẽ những người khác đã tạo một lớp như vậy và tôi chỉ có thể sử dụng định nghĩa tệp tiêu đề "fakeint.h". Có một định nghĩa kiểu "trình bao lớp gốc proxy" như vậy đã có sẵn ở đâu đó trước khi tôi triển khai chúng không?

Tôi nhận ra rằng proxy int của tôi không thể được sử dụng hoán đổi cho nhau một cách đặc biệt vì các định nghĩa chức năng hiện tại đều mong đợi một int .. nhưng đối với ứng dụng của tôi, đây là tất cả trong vòng lặp bên trong. native + - *^= hoạt động, không được sử dụng làm đối số hàm hoặc bất kỳ thứ gì.

+1

bạn nên xem xét các toán tử tăng cường: http://www.boost.org/doc/libs/1_39_0/libs/utility/operators.htm. Nó sẽ cho phép bạn tạo một lớp có tất cả các toán tử điển hình để làm cho nó hoạt động như một kiểu số nguyên gốc. –

+0

@Evan .. cảm ơn, đó là một tài nguyên tốt đẹp nói chung! Overkill cho những gì tôi cần nhưng nếu tôi cần phải cuộn của riêng tôi nó muốn cắt giảm công việc dư thừa đáng kể. – SPWorley

Trả lời

6

Một cái gì đó như thế này ...

template <typename T> class logging_type 
{ 
private: 
    T value; 
public: 
    logging_type() { } 
    logging_type (T v) : value(v) { } // allow myClass = T 
    operator T() { return value; } // allow T = myClass 
    // Add any operators you need here. 
}; 

Điều này sẽ tạo ra một lớp mẫu có thể chuyển đổi thành kiểu gốc theo cả hai hướng. Bạn sẽ cần phải thêm xử lý ghi nhật ký và các toán tử quá tải cho mọi hoạt động được sử dụng trên loại đó trong mã của bạn.

Điều này có thể không hoàn toàn là những gì bạn muốn, vì nó có thể chuyển đổi thành int (hoặc bất kỳ kiểu nào bạn chỉ định), vì vậy mã của bạn có thể âm thầm chuyển đổi đăng nhập của bạn thành int và bạn sẽ bị ghi lại. Bạn có thể ngăn chặn điều này theo một hướng bằng cách thêm một từ khóa 'tường minh' vào hàm tạo, nhưng bạn không thể làm bất cứ điều gì tương tự với toán tử chuyển đổi. Trừ khi bạn có thể làm cho nó riêng tư ... Tôi đã không cố gắng. Làm một trong những điều đó sẽ phần nào đánh bại mục đích mặc dù.

Chỉnh sửa: Vì C++ 11, bạn có thể thêm explicit vào nhà khai thác chuyển đổi.

+2

Điều này cảm thấy rất rất hứa hẹn .. nó có sức hấp dẫn rằng tất cả mọi thứ hoạt động theo mặc định, và funcs duy nhất tôi cần để bọc là những người tôi muốn đối phó với đăng nhập tùy chỉnh. Nó ** gần như ** hoạt động! i = i + 1; OK. cout << i; OK. Nhưng ví dụ i + = 1; hoặc i + +; không làm. Tuy nhiên, điều này có thể hoạt động tốt để điền vào hầu hết các toán tử và tôi có thể xử lý phần còn lại theo cách thủ công. – SPWorley

9

Bạn không thể dẫn xuất một lớp từ int, nhưng bạn sẽ có thể làm cho một lớp học (ví dụ Integer) đó là hoán đổi cho nhau với int bằng cách thực hiện bê tông Data Type thành ngữ Coplein từ Advanced C++: Programming Styles and Idioms và sau đó do quá tải toán tử loại đúc từ Integer đến int và xác định toán tử chuyển đổi từ int thành Integer.

đây là một liên kết mô tả cơ bản Idioms từ cuốn sách

nhưng một liên kết mà tôi nghĩ là khá gần với những gì bạn đang tìm kiếm http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Int-To-Type

-1

bạn không bao giờ có thể lấy được từ các loại nguyên thủy

+2

Đúng, nhưng có những điều khác có thể được thực hiện, đó có lẽ là lý do tại sao bạn nhận được phiếu bầu xuống (từ người khác). –

3

Đây thực sự là một trường hợp mà #define rất hữu ích. Tôi khuyên bạn nên

#ifdef DEBUG 
# define INTGR MyDebugIntegerClass 
#else 
# define INTGR int 
#endif 

Hãy chắc chắn rằng MyDebugIntegerClass thể cast tự nó lên một int thường xuyên, và có tất cả các nhà khai thác thích hợp. Sau đó, viết mã của bạn với INTGR.

Trong chế độ gỡ lỗi, bạn sẽ nhận được tất cả ghi nhật ký lớp học của mình, nhưng ở chế độ phát hành, bạn sẽ nhận được một int đơn giản.

+1

Vâng, tôi đã gõ sẵn để nó thậm chí còn dễ dàng hơn. Câu hỏi chính của tôi là xây dựng một MyDebugIntegerClass hiệu quả mà không cần phải tự bao bọc hơn 50 toán tử int nguyên gốc. (Hoặc chỉ cần tìm một người đã thực hiện nó.) – SPWorley

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