2010-11-23 74 views
-1

在C++中,我需要在运行时将字符串转换为任何类型,我不知道字符串中可能包含哪种类型。我听说有一个lexical_cast可以使用,但是实现它的最有效方法是什么?C++将字符串动态转换为任何基本类型

我可能会从客户端得到一堆这样的字符串: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数据的片段。

+2

[和往常一样](http://www.catb.org/esr/faqs/smart-questions.html):**为什么?** – GManNickG 2010-11-23 09:05:21

+0

@GMan:你是什么意思?你不明白这个问题吗,或者你是否想要我尝试这样做的理由? – 2010-11-23 09:07:03

回答

0

GMan是正确的,如果下层数据结构不同,则不能将任意字符串强制转换为Date类型。但是,您可以解析内容并使用字符串中的数据实例化新对象。例如,std :: atoi()将一个c-string解析为一个int。 你需要解析字符串,而不是转换它。

0

您可以使用VARIANT结构类型(即每种可能的结果中的一种,以及指定它的“类型”以及类型的大枚举)以及ConvertStringToVariant()函数。

0

你所描述的实际上是一个解析器。即使是使用lexical_cast的试错法也只是一个(粗略的)解析器。

我建议澄清输入字符串的格式,然后,如果它足够简单,请手写一个Recursive descent parser来将输入字符串解析为任何适合您需要的数据结构。

0

这太过分了一个猜谜游戏, 如果我有10种可能的类型, 任何给定的字符串

如果你担心这个,你需要一个词法分析器,这样的如flexBoost::Spirit

它仍然是一个猜谜游戏,但是它是一个更“明智”的猜测游戏。

2

使用XML解析器读取XML数据,它将为您完成几乎所有的工作,并处理订购问题。然后,您只需要向解析器询问计算所需的数据。

细节因不同的XML解析器而异 - 去找一个,阅读文档。如果您需要更多帮助,请回到这里,解决XML问题。

相关问题