float getSunActivity() { ... }
int getEarthActivity() { ... }
StatisticSystem::track("sun_activity", boost::any(getSunActivity()));
StatisticSystem::track("earth_activity", boost::any(getEarthActivity()));
class StatisticSystem
{
typedef std::map<string, const boost::any*> stats;
stats mStatsData;
static void track(const string &name, const boost::any ¶m);
void update();
};
StaticSystem::track(const string &name, const boost::any ¶m)
{
mStatsData[name] = ¶m;
}
StaticSystem::update()
{
BOOST_FOREACH(stats::value_type &row, mStatsData)
{
string data = lexical_cast<string>(&row.second);
cout << data << "\n";
// Usage of 'data' value
}
}
看,每个更新调用我需要在所有传递的变量的新值。所以我决定将它们的地址传递给内存。但现在数据包含地址。我怎样才能从中获得价值?是否可能,如果没有,你可以为这个问题提出什么建议?
答案 0 :(得分:0)
存储在地址的数据由一元运算符*。
检索在你的代码中,你应该使用* row.second来获取值,而不是第二个地址。
所有这些代码看起来都很奇怪。地址操纵技术相当值得怀疑,IMO。
答案 1 :(得分:-1)
我建议不要在这种情况下使用BOOST_FOREACH,因为对于代码的读者来说可能有些难以理解。您可以使用普通迭代器重写更新函数:
void StaticSystem::update()
{
for (stats::iterator it = mStatsData.begin(); it != mStatsData.end(); ++it)
{
string data = lexical_cast<string>(*it->second);
cout << data << "\n";
// Usage of 'data' value
}
}
但是,仅此一项不会使您的代码有效。还有一些其他错误/糟糕的设计:
1)除非完全必要,否则不要使用boost :: any - 它是一个繁重的模板类,它会减慢编译速度,并且不会提示内部存储的实际类型。更好的方法是创建类EarthActivity
和SunActivity
,它们都来自公共类Activity
,然后使用Activity*
而不是boost::any*
作为map参数。如果返回的值只是原始值(例如示例中的float
和int
),为什么Sun会返回float
和地球int
?您应该使用float
/ double
。
2)您正在访问静态方法轨道内的类StatisticSystem
的成员,这是无效的,不会编译。如果您正在尝试实现Singleton模式,那么有很多关于如何正确实现它的教程,例如:http://www.yolinux.com/TUTORIALS/C++Singleton.html
3)您缺少函数的返回类型。如果您希望函数不返回任何内容,请将void
指定为其返回类型:
void functionReturningNothing() { /* ... */ }