我正在使用boost :: any将一些数据包含在类方法getValue的地图中。在getValue中,一切正常,数据在地图中适当等。第二个我离开getValue并尝试使用这些数据,它不再在地图中。
这让我很难过,我可能忘记在关键位置使用引用,但我找不到它。
相关代码如下:
test.c的 //我们不想实际记录计时器,如果他愿意,用户可以这样做。 timeval tmp;
tmp.tv_sec = 0;
tmp.tv_usec = 0;
gettimeofday(&tmp, NULL);
getValue<timeval>(timerName) = tmp;
std::cout << tmp.tv_usec << " : " << getSingleton().globalValues.count(key) << std::endl; //Count returns 0 here, for a given key X_X
test.h
/* Grab the value of type T found while parsing. Should use checkValue first.*/
template<typename T>
static T& getValue(const char* identifier) {
//Used to ensure we have a valid value
T tmp;
//Used to index into the globalValues map
std::string key = std::string(identifier);
std::map<std::string, boost::any>& gmap = getSingleton().globalValues;
if(checkValue(identifier)) //If we have the option, set it's value
tmp = getSingleton().vmap[identifier].as<T>(); //vmap is correct, it specifies default values passed in via command line.
//We may have whatever is on the commandline, but what if
//The programmer has made modifications?
if(!gmap.count(key)) //The programmer hasn't done anything, lets register it then
gmap[key] = boost::any(tmp);
std::cout << "gmap " << key << std::endl;
std::cout << getSingleton().globalValues.count(key) << std::endl; //count returns 1 here, for a given key.
return boost::any_cast<T&>(gmap[key]);
}
...
test.h
//Map of global values, stored here instead of in OptionsHierarchy
//For ease of implementation
std::map<std::string, boost::any> globalValues;
答案 0 :(得分:0)
在这些行中,您使用vmap
代替gmap
。是吗?
if(checkValue(identifier)) //If we have the option, set it's value
tmp = getSingleton().vmap[identifier].as<T>();
此外,我注意到您正在使用count
来检查项目是否存在。一般来说,除非您确实需要计数,否则会导致执行的工作量超过find
,但对std::map
而言,将count
优化为find
可能足够聪明。既然如果它不存在就要插入,而当它不存在时,则只需使用insert
,因为这正是行为insert
将给你的。
答案 1 :(得分:0)
我解决了这个问题,请注意我如何将getValue中的键定义为std :: string(identifier)。在test.c中,我将键定义为sanitizeString(..),它显然返回了一个不同的键。当然,你们看不到那么糟糕。