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