1

序章

この簡単な例を紹介しましょう。

#include <cmath>

class X
{
public: // Members

    /// A ^ B + A
    int A;

    /// A ^ B + B
    int B;

public: // Specials

    X(
        const int & A,
        const int & B
    )
        : A(A)
        , B(B)
    {
        const auto Pow = static_cast<int>(std::pow(A, B));

        this->A += Pow;
        this->B += Pow;
    }
};

トリビア

  • 導入されたクラスには、 と の 2 つのメンバー変数がAありBます。
  • それらはそれぞれA ^ B + Aとの値を取りますA ^ B + B
  • どちらも共通の複雑な初期化コードを共有しています (複雑であると仮定しましょうstd::pow)。

問題

ABメンバー の両方を作りたいconstです。

質問

複雑な初期化を繰り返さずにそれを行う方法 (つまり、2 回呼び出すのを避けるstd::pow) は?

私が試したこと

#include <cmath>

class X
{
public: // Members

    /// A ^ B + A
    const int A;

    /// A ^ B + B
    const int B;

public: // Helpers

    struct Init
    {
    public: // Members

        int A;
        int B;

    public: // Specials

        Init(
            const int & A,
            const int & B
        )
            : A(A)
            , B(B)
        {
            const auto Pow = static_cast<int>(std::pow(A, B));

            this->A += Pow;
            this->B += Pow;
        }
    };

public: // Specials

    X(
        const Init& Init
    )
        : A(Init.A)
        , B(Init.B)
    {};

    X(
        const int & A,
        const int & B
    )
        : X(Init(
            A,
            B
        ))
    {};
};
  1. struct Initclass の過去のバージョンの役割を担うように作成しますX
  2. メンバーを作成し、Xメンバーを非const保持にします。Initconst
  3. コンストラクターの委任を使用して、コンストラクターの引数を にリダイレクトしInitます。
  4. constメンバー変数を からInitに移動Xして にしますconst

ただし、私の解決策は複雑すぎるようです。どんな助けでも大歓迎です。

ゴールなし

  • X共通コードの結果を格納する別のメンバー変数を作成します (つまり std::pow)。
  • クラスの外に別のレベルの間接化を追加しますX(たとえば、 の基底クラスを導入しXます)。

ノート

ソリューションでは、C++11 よりも新しいバージョンの C++ を使用できます。

4

2 に答える 2