C++ c+中的强制转换属性+;

C++ c+中的强制转换属性+;,c++,attributes,casting,C++,Attributes,Casting,在我的程序中,我得到一个字符串,它由属性名和属性值组成。例如:字符串x2。我的问题是,我有很多属性,它们有不同的类型。它可以是int、boolean或枚举。例如,x2应该是intx=2状态0应为bool STATUS=false,依此类推 因此,我需要读取字符串,并使用依赖于字符串的值创建属性。我考虑过散列图,但也许你还有别的想法 我也不知道如何将属性的类型放入hash_映射中。 大概是这样的: typedef unordered_map<string, type> MapType;

在我的程序中,我得到一个字符串,它由属性名和属性值组成。例如:
字符串x2
。我的问题是,我有很多属性,它们有不同的类型。它可以是int、boolean或枚举。例如,
x2
应该是
intx=2
状态0
应为
bool STATUS=false
,依此类推

因此,我需要读取字符串,并使用依赖于字符串的值创建属性。我考虑过散列图,但也许你还有别的想法

我也不知道如何将属性的类型放入hash_映射中。 大概是这样的:

typedef unordered_map<string, type> MapType;
typedef无序映射类型;

我知道hash_映射如何与函数指针一起工作;也许有适合这种类型的东西。这可以给我一个引用,例如int、bool,然后我可以搜索映射并从字符串中转换值。

从配置文件或其他文件中获取不同类型的值(布尔值、整数、字符串…),这是一个已经解决了很多次的问题。。。可能太多次了:)

看看它是如何在,,…

中完成的。当您从字符串(如“x2”或“STATUS 0”)加载/读取属性时,您可以使用
映射
类型来存储属性。接下来,编写一个类,例如AttributeContainer,它充当映射的包装器,方法有
getString(string key)
getInt(string key)
,和
getBoolean(string key)
,等等

因此,根据调用方和被调用的get方法,您可以根据首选逻辑解释映射中的值。如果调用getBoolean,您可以自由地将0/1解释为boolean,但是如果调用getInt,则返回int 0或1。

这可以通过Factory模式完成,但您需要有一个根类来派生。例如,工厂如何返回指向
字符串的指针或指向
布尔值的指针

这些物品是如何使用的

另一个建议是为每种类型的对象提供一个
向量
,以及两个
std::map
容器,一个用于创建对象的函数,另一个用于指向创建函数的函数指针。 使用其中一个映射获取用于创建项的函数。 使用另一个贴图获取项目的向量。 通过传递正确的向量来执行函数


另外,它是指向<代码> Value<代码> >

也许你需要看一些C++来解决你的问题。

我不敢相信我会提出这个建议,但是这里…… 定义一个简单的
属性
类,它是
std::string
的包装器,这是您的值。这个类应该提供转换操作符(虽然我不喜欢它们,但在这种情况下,它们可以让生活变得更轻松)

现在,您的界面应该接受一个键并返回
属性
,例如

attribute const& get(std::string const& some_key)
{
  map<>::iterator it = attributes.find(some_key);
  return *it->second; 
}

bool bv = get(some_key); // automatically converted to bool (if lexical_cast doesn't throw)
attribute const&get(std::string const&some_键)
{
迭代器it=attributes.find(some_键);
返回*它->秒;
}
bool bv=获取(某个_键);//自动转换为bool(如果词法转换未抛出)

新句子以大写字母开头。回答起来并不容易,因为它涉及语义:“状态0”为什么bool STATUS=false而不是整数int STATUS=0?@Kiril Kirov::)有趣的是,用于标记句子开头的大写字母是语言中最近添加的一种符号,在自然语言中可能不超过300年。在编程语言方面,有些人仍在等待赶上。。。例如,我没有看到C++中的大写字母的常见表达式。虽然有了涉及电子计算机的计算,但英语在句子的开头总是使用大写字母。还有人称代词“I”。StackOverflow应该使用英语。如果有人的shift键坏了,或者只是功能不稳定,那么修改帖子是很烦人的。普通选民,在这里给一些空间。。。这是他的第一个问题,所以,让他/她在跳过之前尝试解决问题!(这并不重要,当一个人只有1个代表点时,向下投票对用户没有太大影响,除了道德:我不能这样问,人们会猛烈地向下投票,甚至可能结束问题!)是的,但这并不能解决我的问题。这不是我想要的。:-)在调用一些函数之前,例如ReadFloat()。我需要知道我的字符串中有浮点值。这是我的问题。boost将在下一版本中用utree或Property Tree再次解决这个问题。我认为这是迄今为止最接近OP问题的答案。
std::map<std::string, boost::shared_ptr<attribute> > attributes;
attribute const& get(std::string const& some_key)
{
  map<>::iterator it = attributes.find(some_key);
  return *it->second; 
}

bool bv = get(some_key); // automatically converted to bool (if lexical_cast doesn't throw)