4

このサイトのどこかにこのような回答があるのではないかと心配していますが、質問の作成方法さえわからないため、見つけることができません。だからここに問題があります:

ボクセル描画機能があります。最初にオフセット、角度などを計算し、ドローイングを行った後です。ただし、すべての関数のいくつかのバージョンを作成するのは、ピクセルをコピーしたり、ブリットしたり、スムージング効果のためにピクセルごとに 3*3 正方形をブリットしたり、オブジェクトのサイズが変更された場合にピクセルを画面上の n*n ピクセルにコピーしたりするためです。そして、機能の中心にあるその小さな部分には、たくさんのバージョンがあります。

コードの中心部分だけが異なる同じ関数を 10 個書く代わりに、何ができますか? パフォーマンス上の理由から、関数ポインターを引数として渡すことはできません。送信する引数が異なるため、それらをインラインにするとうまくいくかどうかはわかりません。ボリューム(Z値)を計算することもあれば、ピクセルが下から上に描画されることもあると知っています。

誰もが知っているC++でこれを行う方法があると思います。そのために何を学ぶ必要があるか教えてください。ありがとう。

4

5 に答える 5

3

NVIイディオムを使うことをお勧めします。

ケースごとに異なる必要があるロジックを実装するプライベート関数を呼び出すパブリック メソッドがあります。

派生クラスは、特定のタスクに特化したプライベート関数の実装を提供する必要があります。

例:

class A {
public:
    void do_base() {
        // [pre]
        specialized_do();
        // [post]
    }

private:
    virtual void specialized_do() = 0;
};

class B : public A {
private:
    void specialized_do() {
        // [implementation]
    }
};

利点は、基本クラスに共通の実装を保持し、必要に応じてサブクラス (メソッドを再実装する必要があるだけspecialized_do) にそれを詳述できることです。

欠点は、実装ごとに異なる型が必要になることですが、ユース ケースで異なる UI 要素を描画する場合は、この方法が適しています。

于 2013-07-27T09:18:12.567 に答える
0

「中心部分」を適切にパラメータ化できる場合は、高次関数を使用できます。
引数に n を追加する関数を返す関数の簡単な例を次に示します。

#include <iostream>
#include<functional>
std::function<int(int)> n_adder(int n)
{
    return [=](int x){return x+n;};
}
int main()
{
    auto add_one = n_adder(1);
    std::cout<<add_one(5);
}
于 2013-07-27T09:48:45.197 に答える