0

私は統計システムを書いています。指定されたパラメーターで何らかの出力を作成する必要があります。例えば:

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 &param);
   void update();
};

StaticSystem::track(const string &name, const boost::any &param)
{
   mStatsData[name] = &param;
}

StaticSystem::update()
{
    BOOST_FOREACH(stats::value_type &row, mStatsData)
    {
        string data = lexical_cast<string>(&row.second);
        cout << data << "\n";
        // Usage of 'data' value
    }
}

ほら、渡されたすべての変数の新しい値で必要な各更新呼び出し。そこで、メモリ内のアドレスを渡すことにしました。しかし今、データはアドレスで構成されています。そこからどのように価値を得ることができますか?できない場合、この問題について何をアドバイスできますか?

4

2 に答える 2

0

アドレスに格納されているデータは、単項演算子*によって取得されます。

コードでは、secondのアドレスではなく、*row.secondを使用して値を取得する必要があります。

しかし、このコードはすべて独特に見えます。アドレス操作技術はかなり疑わしい、IMO。

于 2010-08-30T07:16:09.480 に答える
-1

この場合、BOOST_FOREACH を使用しないことをお勧めします。これは、内部で何が起こっているかをコードの読者にとってやや難しくする可能性があるためです。単純な反復子を使用して update 関数を書き直すことができます。

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使用します。返される値がプリミティブな値のみである場合 (例のandのように)、なぜ Sunと Earthが返されるのですか? 両方に /を使用する必要があります。 2) クラスのメンバーにアクセスしているActivity*boost::any*floatintfloatintfloatdouble

StatisticSystem静的メソッド トラック内では、これは無効であり、コンパイルされません。シングルトン パターンを実装しようとしている場合は、それを正しく作成する方法に関するチュートリアルがたくさんあります。たとえば、次のようなチュートリアルがあり ます

関数の戻り値の型がありません。関数が何も返さない場合はvoid、戻り値の型として次のように指定します。

void functionReturningNothing() { /* ... */ }
于 2010-08-30T07:29:42.363 に答える