Không, có thể tạo một lớp Radian cần được tối ưu hóa bởi hầu hết các trình biên dịch hợp lý vào một thứ không chậm hơn một float đơn giản. Bạn có thể quan tâm đến boost.units. Trong thực tế, với boost.units bạn thậm chí có thể thiết lập nó để nếu ai đó muốn vượt qua trong một góc độ, nó sẽ tự động được chuyển đổi sang radian trước khi được chuyển đến chức năng. Điều đó sẽ có thể làm chậm mọi thứ xuống một chút, nhưng nó sắp xếp nó để bạn có thể thay đổi những gì đơn vị một chức năng muốn mà không cần phải quay trở lại và chỉnh sửa một tấn toàn bộ mã.
Và khi cuối cùng bạn muốn chuyển và chỉnh sửa tất cả mã, bạn có thể tạm thời sửa lỗi để chuyển đổi không hoạt động và để trình biên dịch tìm thấy nó cho bạn.
Có thể làm cho trình biên dịch thực thi các ràng buộc như thế này cho bạn mà không có hình phạt thời gian chạy và thậm chí có thể viết tất cả mã chuyển đổi cho bạn (một hình phạt thời gian rất nhỏ) là một trong những điều thực sự gọn gàng về C++ và làm cho nó xứng đáng với sự phức tạp thêm trên C.
đây là một phiên bản thực sự đơn giản về những gì lớp này có thể trông như thế nào nếu bạn tay mã hoá nó:
#include <cmath>
// This class is tiny enough because it has no virtual functions and only one
// data member that it's likely more efficient to pass by value than by
// reference.
class Radians {
public:
// If you don't put in explicit, the compiler will automatically convert a
// float to a Radians for you and undo all of the hard work you did to make
// sure callers express their intentions.
explicit Radians(float radians) : value_(radians) {}
float getValue() const { return value_; }
void setValue(float radians) { value_ = radians; }
float asDegrees() const { return value_ * 180/M_PI; }
// This allows you to say Radians r = Radians::fromDegrees(something);
static Radians fromDegrees(float degrees) {
return Radians(degrees * M_PI/180);
}
private:
float value_;
};
Thông báo như thế nào tất cả các chức năng được khai báo trong cơ thể lớp. Điều này làm cho tất cả chúng hoàn toàn có từ khóa inline
. Một trình biên dịch tốt sẽ tối ưu hóa tất cả các chức năng đó ra khỏi sự tồn tại. Tất nhiên, các chức năng chuyển đổi sẽ tạo ra mã để thực hiện chuyển đổi, nhưng nếu không nó sẽ giống như có một phao trần.
Việc sử dụng lớp 'Radian' bổ sung sẽ chỉ làm cho chương trình 'chậm hơn' nếu mã của bạn được viết kém. Hầu hết các trình biên dịch (đặc biệt là GCC) các lớp 'wrapper' nội tuyến đến mức không có mã nào cả. – LiraNuna
@Phineas Nếu bạn định cung cấp "set/get" cho phao thì đừng đi! Trừ khi bạn sẽ ẩn đại diện của 'Radian', chỉ cần viết:' typedef float Radian; ';) – AraK
@AraK, tôi nghĩ một trong những điều mà OP quan tâm là thực tế là tất cả những người gọi hàm sẽ không nhất thiết phải được cập nhật để sử dụng loại đơn vị mới và do đó sẽ âm thầm trở thành sai. Một typedef không khắc phục vấn đề này. – Omnifarious