0

パラメーターを前処理し、処理されたパラメーターを初期化に使用できるように、コンストラクターのコンマ演算子を台無しにしています。

次の基本クラスと派生クラスがあるとします。

class Base
{
    protected:
        int i;
        int j;
    public:
        Base(int a):i(a),j(a){}
        Base(int a, int b):i(a),j(b){}
};

class Derived:public Base
{
    private:
        int d;
        void inc(int & a) {a++;}
        void inc(int & a, int & b) {a++; b++;}
    public:
        Derived(int a, int b, int c); 
};

次のように、コンマ演算子を使用してパラメーターを処理し、それを使用して基本部分を初期化できることを知っています。

Derived::Derived(int a, int b, int c):Base((inc(a),a)),d(c){}

では、2 つのパラメーターを前処理し、それらを使用してベースを初期化したい場合はどうでしょうか? 私は次のことをしました:

Derived::Derived(int a, int b, int c):Base((inc(a,b),(a,b))),d(c){}

しかし、これは私が望むものではありません。単一パラメーターの基本コンストラクターが引き続き使用されるためです ((a,b)は を返すコンマ演算子でもあるためb)。コンマ演算子が不可能な場合、私が望むものを達成する方法はありますか?

4

1 に答える 1

4

これは単なる意見として成り立つ可能性がありますが、そのような表現を書くことはお勧めしません。実際の関数が呼び出される前に何が実行されているかを正確に把握するために、メンテナーに余分な負担をかけています。関数が取る引数の数を把握することでさえ、いくらかの努力が必要になります。コンマは通常、そのコンテキストでは引数を区切るためにのみ使用されるからです。

単一の引数の場合、次のようにします。

class Derived : Base {
    static int computeSomething(int a) { return a+1; }

    Derived(int a) :
        Base(computeSomething(a)), ...
    { ... }
};

新しい値を返すことに注意してください。a型が高すぎてコピーできない場合は、参照によって取得して返すこともできます。

一度にすべてを更新する必要がある複数の引数の場合、base を変更して、引数のパック全体を名前付きエンティティ、またはおそらく a で受け取り、std::tuple単一引数バージョンのようにします。

于 2013-10-16T06:58:23.563 に答える