C ++ Динамическое преобразование строки в любой базовый тип - PullRequest
0 голосов
/ 23 ноября 2010

В C ++ мне нужно преобразовать строку в любой тип во время выполнения, когда я не знаю, какой тип я получаю в строке. Я слышал, что в boost есть возможность использовать lexical_cast, но какой самый эффективный способ его реализовать?

Я мог бы получить такую ​​строку от клиента: Date = "25/08/2010", Someval = "2", Blah = "25.5".

Теперь я хочу иметь возможность преобразовать эти строки в их тип, например, Somval, очевидно, является int, а Date может быть boost :: date или чем-то еще. Дело в том, что в настоящее время я не знаю, в каком порядке они будут предоставлены мне, поэтому сложно написать код, который будет выполнять кучу приведений.

Я мог бы использовать кучу операторов if / else или операторов switch / case, однако я думаю, что, возможно, есть лучший способ сделать это.

Я не ищу что-то отличное от lexical_cast, я могу полностью использовать это, я ищу, если кто-то знает лучший способ сделать это:

std::string str = "256";
int a = lexical_cast<int>(str);

//now check if the cast worked, if not, try another... 

Это слишком сложная игра в догадки, и если у меня есть 10 возможных типов для любой заданной строки, это звучит немного неэффективно. Особенно, если он должен сделать 1000 из них в любой момент времени.

Кто-нибудь может посоветовать?


Алекс Браун примечания - пример строки представляет собой фрагмент данных XML, поступающих от клиента.

Ответы [ 5 ]

2 голосов
/ 23 ноября 2010

Используйте синтаксический анализатор XML для чтения XML-данных, он сделает почти всю работу за вас и решит проблемы с заказами. Затем вам нужно просто запросить у парсера данные, необходимые для расчета.

Детали различаются в разных XML-парсерах - найдите и прочитайте документацию. Если вам нужна дополнительная помощь, вернитесь сюда с вопросом парсера XML.

0 голосов
/ 23 ноября 2010

Это слишком сложная игра в догадки, и если у меня есть 10 возможных типов для любой заданной строки

Если вы обеспокоены этим, вам нужен лексический анализатор,например, flex или Boost :: Spirit .

Это все еще будет игра в догадки, но более "информированная" игра в догадки.

0 голосов
/ 23 ноября 2010

вы можете использовать тип структуры VARIANT (то есть один из всех возможных результатов, и "тип", указывающий, какой это был, и большое перечисление типов) и функцию ConvertStringToVariant().

0 голосов
/ 23 ноября 2010

То, что вы описываете, на самом деле является синтаксическим анализатором. Даже метод проб и ошибок с использованием lexical_cast на самом деле просто (грубый) парсер.

Я предлагаю уточнить формат входной строки, а затем, если это достаточно просто, написать Анализатор рекурсивного спуска вручную, чтобы разобрать входную строку в любую структуру данных, удобную для вас. 1006 *

0 голосов
/ 23 ноября 2010

GMan прав, вы не можете привести произвольную строку, например, к типу Date, если базовая структура данных отличается.Тем не менее, вы можете проанализировать содержимое и создать новый объект, используя данные в строке.Например, std :: atoi () анализирует c-строку для int.Вам нужно проанализировать строку, а не приводить ее.

...