2013-02-24 27 views
6

Các mã sau đây không biên dịch (g++ 4.7.2):std :: chrono: thêm thời gian tùy chỉnh để time_point

#include <chrono> 

typedef std::chrono::duration<double> double_prec_seconds; 
typedef std::chrono::time_point<std::chrono::system_clock> timepoint_t; 

void do_something(const timepoint_t& tm) 
{ 
    // ... 
} 

int main(int argc, char** argv) 
{ 
    timepoint_t t0 = std::chrono::system_clock::now(); 
    timepoint_t t1 = t0 + std::chrono::seconds(3); 

    // timepoint_t t3 = t0 + double_prec_seconds(3.14); 
    auto t3 = t0 + double_prec_seconds(3.14); 

    do_something(t1); 
} 

Vấn đề của tôi là tôi không biết những gì loại t3 có. Nó không phải là timepoint_t và không nhận xét được dòng có loại được đưa ra một cách rõ ràng sẽ không biên dịch. Cùng với lời gọi hàm: Tôi không thể gọi do_something với t3.

Vì vậy, câu hỏi của tôi là:

  • Tại sao việc chuyển đổi thất bại?
  • Cách tốt nhất để có thời lượng giây chính xác gấp đôi là gì?

tôi biết rằng tôi có thể sử dụng một dàn diễn viên phụ như thế này

// this works 
timepoint_t t3 = t0 + std::chrono::duration_cast<std::chrono::milliseconds>(double_prec_seconds(3.14)); 

nhưng tôi muốn tránh điều này.

Cảm ơn bạn trước!

+1

Tôi đã in loại t3 bằng cách sử dụng typeid (t3) .name(), đường dẫn stdout tới C++ filt và nó cho biết 'std :: chrono :: time_point >> '. Chỉ là FYI. –

+0

THANK YOU cho gợi ý với công cụ này! Tôi đã làm về cơ bản giống nhau, chỉ cần không có 'C++ filt' và không có gì" hữu ích "ngoại trừ một tên bí ẩn. 'C++ filt' dường như giúp đỡ, không biết điều đó. –

Trả lời

7

Việc chuyển đổi thất bại, vì không có chuyển đổi từ

std::chrono::time_point< std::chrono::system_clock, 
         std::chrono::system_clock::duration > 

để

std::chrono::time_point< std::chrono::system_clock, 
         std::chrono::duration<double> > 

Cách đơn giản nhất sẽ được cung cấp cho double_prec_seconds làm mẫu tham số để time_point, xem std::chrono::time_point

typedef std::chrono::time_point< std::chrono::system_clock, 
           double_prec_seconds > timepoint_t; 

thì bạn đã có e loại thích hợp cho t3do_something.

+0

Hoàn hảo! Cảm ơn bạn! Tôi đã cố gắng để cung cấp một chuyển đổi, nhưng không nghĩ về việc thay đổi 'typedef' của tôi. Mã của tôi bây giờ trông và hoạt động như dự định. –

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