介绍
让我们介绍这个简单的例子:
#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;
}
};
琐事
- 引入的类有两个成员变量:
A
和B
。 - 它们分别取
A ^ B + A
和的值A ^ B + B
。 - 它们都共享共同的复杂初始化代码(假设
std::pow
是复杂的)。
问题
我想同时制作A
和B
成员const
。
问题
如何在不重复复杂初始化的情况下做到这一点(即避免调用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
扮演过去版本的角色的 classX
。 - 使
X
成员成为非成员const
。Init
const
- 使用构造函数委托将构造函数参数重定向到
Init
. - 将非
const
成员变量从Init
to移动X
并生成它们const
。- 请注意,没有
std::move
TriviallyCopyable 。int
- 请注意,没有
但是,我的解决方案似乎过于复杂。任何帮助,将不胜感激。
没有目标
- 制作另一个
X
将存储公共代码结果的成员变量(即std::pow
)。 - 在类之外添加另一个级别的间接
X
(例如为 引入基类X
)。
笔记
解决方案可以使用比 C++11 更新的 C++ 版本。