Указание дополнения к std :: to_string ()? - PullRequest
3 голосов
/ 13 декабря 2011

В C ++ 11, поскольку существует стандарт std :: to_string () , я перегружаю эту функцию для классов перечисления и других небольших классов данных, где реализация имеет смысл.

Мой вопрос: что вы реализуете в качестве дополнения к std::to_string()?

Какой-то from_string() (которого нет в std) или есть более подходящий стандартный интерфейс, который вы реализуете в своих классах?

Ответы [ 4 ]

6 голосов
/ 13 декабря 2011

при стандартном использовании используется схема краткого именования, использованная в старом C. Таким образом, где у вас есть

std::string to_string( int value );

, у вас есть

int std::stoi(std::string);

см. Здесь

http://en.cppreference.com/w/cpp/string/basic_string/stol

так, где у вас может быть.

std::string to_string(my_enum);

у вас может быть

my_enum stomy_enum(std::string)

хотя я просто буду многословен об этом

my_enum string_to_my_enum(std::string)

или просто используйте потоки

std::stringstream ss(my_str);
if(ss >> emun_) //conversion worked

Определение оператора потока также позволяет использовать лексическое приведение от boost;

enum_ = boost::lexical_cast<my_enum>(my_str);
0 голосов
/ 13 декабря 2011

Стандартная библиотека C ++ 11 имеет только stoi и др.для этого, насколько я знаю.Однако, если вы согласны с использованием boost (который я бы назвал квази-стандартной библиотекой для c ++), вы можете использовать boost::lexical_cast.Чтобы это работало, вам просто нужно определить операторы потока operator>> соответственно operator<< (для преобразования в строку) для std::istream (std::ostream) для ваших собственных классов.

Когда вы не используете boost Я бы все еще использовал для этого потоковые операторы, поэтому, чтобы получить int из строки, я бы сделал что-то вроде следующего:

std::string s = ...;
int i;
std::stringstream stream(s);
stream>>i;

Конечно, вы можете поместить это в более общую функцию, которая будетдать вам функциональность, аналогичную boost::lexical_cast.

0 голосов
/ 13 декабря 2011

Если ваш тип является классом, конструктор, принимающий строку в качестве аргумента, будет иметь больше смысла, чем свободная функция для меня.

0 голосов
/ 13 декабря 2011

C ++ 11 имеет stoi, stol, stod и т. Д. Для арифметических типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...