2012-03-21 27 views
6

Trong tiêu đề của C++ 11, có ba hàm mới để chuyển đổi giữa số và chuỗi.Chuyển đổi số

std::string std::to_string(unsigned long long); 
std::string std::to_string(long double); 
std::string std::to_string(long long); 

Câu hỏi đầu tiên - tại sao chỉ có 3 chức năng? Điều gì về int đơn giản hoặc int unsigned, vv?

Câu hỏi thứ hai - tại sao to_string không loại trừ ngoại lệ trong mã sau?

long double x = std::numeric_limits<long double>::quiet_NaN(); 
std::string i = std::to_string(x); 
long double c = std::stold(i); // i = "1.#QNAN" 

Và câu hỏi thứ ba - tại sao c bằng 1.0?

+0

phỏng đoán hoang dã, nhưng có thể chỉ ba số này tồn tại vì số nguyên nhỏ hơn và các loại dấu phẩy động có thể dễ dàng chuyển đổi chúng mà không mất thông tin. – Collin

Trả lời

5
  • "Chừng nào nó mang lại các hành vi được mô tả, làm những gì bạn xin vui lòng .."

    Tất cả các loại số nội tại có thể ngầm được chuyển đổi sang một trong hai unsigned long long, long double hoặc long long và vẫn giữ độ chính xác cần thiết, do đó không cần quá tải nữa.

    Tiêu chuẩn cho biết phải xác định các chức năng sau, mặc dù lib xác nhận theo tiêu chuẩn là tự do làm "bất cứ điều gì nó muốn" miễn là nó mang lại hành vi tương tự như được mô tả.


  • Tại sao nó nên ném một ngoại lệ?

    std::numeric_limits<long double>::quiet_NaN(); là một giá trị hợp lệ, và std::to_string (T) được mô tả trong tiêu chuẩn để mang lại hành vi tương tự như gọi sprintf với thích hợp định dạng chuỗi.

§ 21.5/6                   chuyển đổi Numeric

  • string to_string(int val);
  • string to_string(unsigned val);
  • string to_string(long val);
  • string to_string(unsigned long val);
  • string to_string(long long val);
  • string to_string(unsigned long long val);
  • string to_string(float val);
  • string to_string(double val);
  • string to_string(long double val);

    ..

Returns:

  • Mỗi hàm trả về một đối tượng chuỗi giữ đại diện nhân vật về giá trị của đối số của nó mà có thể được tạo ra bởi gọi sprintf (buf, fmt, val) với một specifier định dạng của "% d", " % u", "% ld", "% lu", "% lld", "% llu", "% f", "% f", hoặc "% Lf ", tương ứng, trong đó buf chỉ định bộ đệm ký tự bên trong đủ kích thước.

  • Về những gì trình biên dịch là c bằng 1.0?

    Việc chuyển đổi nên tạo ra một -giá trị NaN nếu giá trị của i là chuỗi đại diện của NaN (không chứa bất kỳ chữ số).

    Nếu không có chuyển đổi phù hợp, bạn có thể tìm thấy hàm được mô tả để ném invalid_argument.

    MSVC sẽ mang lại 1.#QNAN khi cố gắng chuyển đổi std::numeric_limits<long double>::quiet_NaN(); thành std::string.

    Khi sử dụng std::stold nó sẽ tìm kiếm các ký tự khoảng trắng không đầu tiên, và sau đó sử dụng càng nhiều chữ số như được tìm thấy (trong trường hợp này chỉ 1), do đó c sẽ bằng 1.0 sau khi gọi hàm.

+0

visual studio 2010 – innochenti

+0

i = "1. # QNAN"; – innochenti

+0

@innochenti xem câu trả lời được cập nhật. –

1

tôi thấy toàn bộ gói trong bản sao của tôi của tiêu chuẩn:

string to_string(int val); 
string to_string(unsigned val); 
string to_string(long val); 
string to_string(unsigned long val); 
string to_string(long long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string(long double val); 

Có lẽ trình biên dịch của bạn chỉ cần đã không được thực hiện tất cả trong số họ chưa?

Các chức năng được mô tả như

Returns: Mỗi hàm trả về một đối tượng chuỗi giữ đại diện đặc trưng của giá trị của đối số của nó mà có thể được tạo ra bằng cách gọi sprintf(buf, fmt, val) với một specifier dạng của "%d", "%u", "%ld" , "%lu", "%lld", "%llu", "%f", "%f" hoặc "%Lf", tương ứng, trong đó buf chỉ định bộ đệm ký tự bên trong đủ kích thước.

Vì nó được cho là bao bọc xung quanh sprintf, có lẽ đã quyết định không ném bất kỳ ngoại lệ nào, vì sprintf thì không.

+0

Tôi đang sử dụng hình ảnh C++ & msvc2010. – innochenti

+0

Tôi tin rằng các chức năng bổ sung đã được thêm vào tiêu chuẩn ở giai đoạn cuối, bởi vì những người như bạn đã yêu cầu họ. VC2010 đã được phát hành trước đó. –

+0

Lạ. Tôi tự hỏi tại sao họ không quấn std :: ostringstream hoặc std :: istringstream? – Robinson

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