1

と のような関数を作成したいとしますが、processResultの各呼び出しごとに 0、1、2、または n 回呼び出す必要がsendResultあるため、それらをチェーンすることはできません。C++11 でこれを行う適切な方法は何ですか?processResultsendResultprocessResult

私は2つの解決策を考えました:
1)最初の関数にstd::functionパラメーターを与えて(そしてそれに割り当てprocessResultて)、必要なときに呼び出すことができるようにします。

2)(これは好きではありません-複雑すぎるようです)スレッドセーフキュー、関数を2つのスレッドに入れます...

@リクエストの例:

input 1,2,3
calls of functions:
processResult(1)
//nothing
processResult(2)
//calls:
sendResult(10)
sendResult(20)
sendResult(50)
processREsult(3)
//calls
sendREsult(55)
4

4 に答える 4

0

sendResult をクラスに入れるだけかもしれません。プロセス Result のクラスでそのクラスのオブジェクトを定義します。その後、このオブジェクトを使用して処理結果から必要な回数だけ sendResult を送信できます。

于 2013-06-05T11:13:10.460 に答える
0

ある関数を他の関数から何度でも呼び出す必要がある場合は、内部で関数を呼び出すことができます(必要なものを前方宣言する場合は、その逆も可能です)。processResultsendResult

int processResult() { /* blah blah */ }

void sendResult() { 
    while(needed) {
        if(needed)
           processResult();
    }
}
于 2013-06-05T11:07:34.070 に答える
0

これは実際には関数合成のようには見えません。私が読んだprocessResultことから、データをさらに処理するいくつかの外部メソッドを呼び出すことができるはずです。そのような場合、次の2つの解決策について考えます。

  • に渡しstd::functionますprocessResult。これにより、関数、ファンクター オブジェクト、さらにはラムダなど、より多くのオブジェクトをそのメソッドに渡すことができます。
  • 必要なすべての操作を提供するインターフェースを作成し、それを processResult に渡します。
  • これら 2 つのメソッドをいわゆるプロセッサ クラスに変更します。関数やメソッドよりも柔軟に使用できるため、プログラムの複雑さが増した場合は、こちらの方がニーズに適しているはずです。

    class VectorSender : IDataSender
    {
    private:
        std::vector<Data> & target;
    
    public:
        VectorSender(std::vector<Data> & newTarget)
            : target(newTarget)
        {
        }
    
        // Implementation of IDataSender
        void Send(Data data)
        {
            target.push_back(data);
        }
    };
    
    class Processor : IDataProcessor
    {
    private:
        sender : IDataSender;
    
    public:
        Processor(IDataSender newSender)
            : sender(newSender)
        {
        }
    
        // Implementation of IDataProcessor
        void Process()
        {
             // Do some processing
             if (sendData)
                  sender.Send(someData);
        }
    };
    

前の例では、Sender は実際の送信を実行する別のクラスを取得することもできるため、より多くの依存オブジェクトを「連鎖」させることができます。

プログラムのアーキテクチャに大きく依存しており、残念ながら、それに関する詳細な情報がなければ、誰もあなたを助けることはできません.

于 2013-06-05T11:10:01.107 に答える