介绍
让我们介绍这个简单的例子:
#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。Initconst - 使用构造函数委托将构造函数参数重定向到
Init. - 将非
const成员变量从Initto移动X并生成它们const。- 请注意,没有
std::moveTriviallyCopyable 。int
- 请注意,没有
但是,我的解决方案似乎过于复杂。任何帮助,将不胜感激。
没有目标
- 制作另一个
X将存储公共代码结果的成员变量(即std::pow)。 - 在类之外添加另一个级别的间接
X(例如为 引入基类X)。
笔记
解决方案可以使用比 C++11 更新的 C++ 版本。