序章
この簡単な例を紹介しましょう。
#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
)。
問題
A
とB
メンバー の両方を作りたい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
))
{};
};
struct Init
class の過去のバージョンの役割を担うように作成しますX
。- メンバーを作成し、
X
メンバーを非const
保持にします。Init
const
- コンストラクターの委任を使用して、コンストラクターの引数を にリダイレクトし
Init
ます。 - 非
const
メンバー変数を からInit
に移動X
して にしますconst
。- TriviallyCopyableがないことに注意して
std::move
ください。int
- TriviallyCopyableがないことに注意して
ただし、私の解決策は複雑すぎるようです。どんな助けでも大歓迎です。
ゴールなし
X
共通コードの結果を格納する別のメンバー変数を作成します (つまりstd::pow
)。- クラスの外に別のレベルの間接化を追加します
X
(たとえば、 の基底クラスを導入しX
ます)。
ノート
ソリューションでは、C++11 よりも新しいバージョンの C++ を使用できます。