2017-05-31 16 views
5

Tôi đang xem một số mã sử dụng duration_cast. Nhìn vào nó, tôi tự hỏi tại sao một static_cast không được sử dụng vì mục đích của cuộc sống là để chuyển đổi giữa các loại.Tại sao C++ giới thiệu duration_cast thay vì sử dụng static_cast?

Tại sao C++ cần một toán tử mới để chuyển đổi giữa các lần? Tại sao static_cast không được sử dụng?


Có lẽ tôi không đánh giá cao sự khác biệt C++ đang thực hiện giữa milli-giây, micro-giây, nano-giây, vv Đối với một số lý do, tôi nghĩ câu trả lời sẽ được rõ ràng hoặc thảo luận trên Stack Overflow, nhưng tôi chưa tìm thấy nó (chưa).

+1

duration_cast thực hiện một phép tính toán học để dịch giữa hai khoảng thời gian của các phép đo khác nhau. Một static_cast chỉ có thể được thực hiện giữa các lớp trong một hệ thống phân cấp liên quan. Một duration_cast dịch giữa hai lớp hoàn toàn không có mối quan hệ nào, với bất kì cái gì. –

+3

Sự khác biệt chính là static_cast được xây dựng trong trình biên dịch, trong khi duration_cast là một mẫu trong thư viện chuẩn. – dasblinkenlight

+0

Cảm ơn @dasblinkenlight. Nó không xảy ra với tôi rằng 'duration_cast' không phải là một toán tử (kỹ thuật C++ khủng khiếp). Tôi có nên xóa câu hỏi này không? – jww

Trả lời

4

Đã có chuyển đổi trực tiếp khoảng thời gian khi không có nguy cơ mất chính xác. duration_cast là bắt buộc khi có nguy cơ mất chính xác.

duration_cast do đó không phải là nhà điều hành nhiều như là một chuyển đổi có chủ ý.

static_cast không phù hợp vì các loại thời lượng khác nhau không liên quan. Họ là những lớp học hoàn toàn khác nhau xảy ra để hỗ trợ cùng một khái niệm.

ví dụ .:

#include <chrono> 

int main() 
{ 
    using namespace std::literals; 

    // milliseconds  
    auto a = 10ms; 

    // this requires a duration-cast 
    auto lossy = std::chrono::duration_cast<std::chrono::seconds>(a); 

    // but this does not 
    auto not_lossy = std::chrono::nanoseconds(a); 
} 
+0

Cảm ơn @Richard. Phần (nhất?) Của sự nhầm lẫn của tôi đã tin rằng nó là một nhà điều hành được xây dựng trong vì cách nó được đặt tên. Trong thực tế, tôi gọi nó là một nhà điều hành trong câu hỏi, và dasblinkenlight nhặt nó lên. Nếu bạn thêm một cái gì đó về nó không phải là một nhà điều hành, sau đó tôi sẽ có thể chấp nhận. – jww

+0

@jww Tôi vừa đọc nhận xét. Tôi đánh giá cao sự quan tâm của bạn về việc đặt tên, nhưng cũng xem xét 'dynamic_pointer_cast',' static_pointer_cast', et al. Khái niệm về diễn viên cấp độ không thuộc ngôn ngữ này có dạng trước. –

+0

Cảm ơn @Richard. Có nguy cơ gây tranh cãi (nó thực sự chỉ là một cái nhìn ngây thơ của sự vật kể từ khi tôi không ở cạnh cắt) .... C++ sử dụng 'X_cast' như các toán tử (như' static_cast'); và C++ 11 bắt đầu xu hướng 'to_X' (như' to_string'). Có vẻ như sẽ ít khó hiểu hơn khi sử dụng 'to_duration'. – jww

1

Tôi đã xem xét lại mà hỏi rất nhiều trong những năm qua, và bây giờ tôi nghĩ rằng có thể là một sai lầm thiết kế trên một phần của tôi.

Tôi hiện đang thử nghiệm tùy thuộc nhiều hơn vào cú pháp chuyển đổi rõ ràng cho các chuyển đổi không nên được thực hiện ngầm định, thay vì "cú pháp chuyển đổi được đặt tên".

Ví dụ:

https://howardhinnant.github.io/date/date.html#year

year y = 2017_y; 
int iy = int{y}; // instead of iy = y.to_int() 
+0

có những suy nghĩ chuyên nghiệp nào được mô tả ở đâu đó trên web không? – bolov

+0

Tôi đã viết chúng ở đây và ở đó, nhưng không có giấy dành riêng cho chủ đề này. Lợi thế tôi thấy là cú pháp chuyển đổi _uniform_. Điều này không chỉ làm cho mã chung dễ viết hơn mà còn giúp dễ dàng tìm hiểu các API mới vì bạn không còn phải nhớ cách đánh vần 'to_int', hoặc' as_int', hay 'get', hay bất cứ thứ gì. Chỉ có chuyển đổi tiềm ẩn và chuyển đổi rõ ràng: 'T t = u;' và 'tự động t = T {u};'. –

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