С++ 11 вводит удобные функции stoi
, stol
, stoll
, stoul
, stoull
, stof
, stod
и stold
, которые преобразуют строку в целое число, long, long long, unsigned long, unsigned long long, float, double или long double, соответственно.
Почему нет любви к короткому и неподписанному короткому?
Помимо того факта, что упущение меня раздражает из принципа, я обнаружил, что мне приходится неудобно работать в таких ситуациях:
#include <string>
struct S
{
S(short);
};
int main()
{
S s{std::stoi("4")};
}
Ошибка:
test.cpp: In function 'int main()':
test.cpp:10:23: error: narrowing conversion from 'int' to 'short int' inside { } [-fpermissive]
Я хотел бы вместо этого написать S s{std::stos("4")};
, если только был stos
...
Вместо этого мне нужно написать S s{static_cast<short>(std::stoi("4"))};
... oh wait, и это тоже не получится, что беззвучно усекает целые числа дольше, чем короткие, в отличие от гипотетической stos
функции, которая генерирует исключение, если целое число не вписывается в короткий. Поэтому в основном я вернусь к моим пред-С++ 11 альтернативам stringstreams
, boost::lexical_cast
и т.д.
РЕДАКТИРОВАТЬ. Поскольку людям, кажется, нелегко найти мой реальный вопрос, почему нет функций stos
и stous
, чтобы идти вместе с другими