2

配列に存在する可能性のある複数の処理ユニットがあり、それぞれに独自のパラメーターがあります。別の質問の解決策として提案された後、コンテキスト パターンを使用して各処理ユニットのパラメーターを伝えたいと思います。ただし、パターンの単純な C++ の例をオンラインで見つけることができません。検査のために、以下に単純化した実装を作成しました。コードは問題なく動作し、コンパイルされますが、パターンを正しく実装していますか? スタイルの改善のためのあらゆる提案は大歓迎です。

#include <iostream>
#include <sstream>

#include <map>

class cParamsContext
{      
     typedef std::map<std::string, float> myMap_t; //Make the return type of getter less wordy
     myMap_t paramMap;

public:              
    cParamsContext()
    {
        paramMap["a0"] = 1.f;
        paramMap["a1"] = 2.f;
    }

    myMap_t const& getMap() const {return paramMap;} //Return read-only alias   
};

class cProcessUnit
{
    float parameter;
    int id;

public:
    cProcessUnit(cParamsContext &contextObj, int id_) : parameter (0.f), id(id_)
    {
        std::stringstream idStream;
        idStream << id;

        std::string key = std::string( "a" + idStream.str() );

        if(contextObj.getMap().find( key ) != contextObj.getMap().end())        
            parameter = contextObj.getMap().find( key )->second; // https://stackoverflow.com/questions/10402354/using-overloaded-operator-via-an-accessor-function#10402452                 
    }

    float getParam() {return parameter;}
};


int main(int argc, char *argv[])
{
    cParamsContext contextObj;


    for (int nn=0; nn<3; nn++)
    {
        cProcessUnit temp(contextObj, nn);
        std::cout << "Processing unit "  << nn << " param = " << temp.getParam() << std::endl;
    }
}

さらに、パラメーター マップが変更された場合に、各クラス内のパラメーター自体を更新する方法を提案できますか?

興味がある場合、出力は次のようになります。. . .

Processing unit 0 param = 1
Processing unit 1 param = 2
Processing unit 2 param = 0
4

2 に答える 2

1

これは有効な実装のように見えます。それはあなたのテストに合格しますか?私はこの特定の方法でコンテキストパターンを使用した経験はありませんが、私には問題ないように見えます。

値の更新に関しては、現在、割り当てられたプロジェクトで非常によく似た処理を行っており、オブザーバーパターンを使用しています。この場合cParamsContext、は観測可能になります。オブザーバーパターンのシグナル/スロット/イベント/デリゲートの実装を使用しています。これまでのところ、それは私の仕事のために驚異的に働いてきました。

于 2012-05-01T17:23:29.717 に答える
1

問題なく動作するようですが、以下にいくつかの提案を示します。

  1. よりパフォーマンスの高いハッシュ マップ/テーブルの使用を検討してください。あなたが見ることができるブーストを持っています。std::map はパフォーマンスに関しては優れていますが、データセットによっては、ハッシュ テーブルの方がパフォーマンスが向上する場合があります。

  2. 値をテンプレート化することを検討するか、少なくとも各タイプと対応するゲッター/セッターのマップを作成して、異なるタイプを許可してください。現在、使用されているパラメーターは float のみですが、将来別のパラメーターが必要になった場合はどうなりますか?

于 2012-05-01T17:47:56.673 に答える