2

Param次のように定義されたクラスがあるとしましょう:

class Param {
public:
    std::vector<double> lb;
    std::vector<double> mid;
    std::vector<double> ub;
    int level;
};

このクラスの目的は、下限と上限 (それぞれ と )、およびさまざまなパラメーターの中間推定値を定義するlbことubです。lb与えられたオブジェクトに対して、 、mid、およびubが同じ数の要素を持つと仮定します。

さて、もし なら、見積もりlevel<0を使いたいです。lbなら見積もりlevel==0を使いたい。midそれ以外の場合 (の場合)、見積もりlevel>0を使用したい。ub

私の質問はstd::vector<double>:の値に基づいて適切なメンバーに自動的に「パススルー」する単一のメンバー関数 (または参照メンバー変数に似たもの) を作成するにはどうすればよいlevelですか?

たとえば、関数がある場合

void f(const std::vector<double>& X);

また

void g(std::vector<double>& X);

私はこのようなことができるようにしたい:

Param myParam;
// set values of myParam.lb, myParam.mid, and myParam.ub, and myParam.level
f(myParam.__?__);
g(myParam.__?__);
4

2 に答える 2

2

クラスにキャスト演算子を追加できます。

class Param {
    //...

    operator std::vector<double>& () {
        if( level < 0 ) return lb;
        if( level > 0 ) return ub;
        return mid;
    }

    operator const std::vector<double>& () const {
        if( level < 0 ) return lb;
        if( level > 0 ) return ub;
        return mid;
    }
};

これで、次のように呼び出すことができます。

f(myParam);
g(myParam);
于 2013-08-15T02:44:14.823 に答える
0

とてもシンプルです。

std::vector< double > & getBound() {
    if ( level < 0 ) return lb;
    if ( level == 0 ) return mid;
    return ub;
}

必要に応じて、参照をconst返すオーバーロードを追加します。const &

これよりトリッキーなことはしないことをお勧めします。オブジェクトから何かを取得したい場合は、通常、名前が付けられていないにもかかわらず自動的に呼び出される関数を定義するよりも、関数について言及する方が適切です。

(注: 3 時間以上前にこれを送信しましたが、接続の問題で送信が遅れたため、重複しています。)

于 2013-08-15T06:38:43.060 に答える