在旧的 C++98 中,我认为没有任何好的方法可以在初始化列表中重用临时结果来初始化一个对象的多个成员。
这在较新版本的 C++(11、14、17)中是否有任何变化?
考虑以下代码:
//
// compileShaders()
//
// Takes a string containing the source code to possibly hundreds of shaders
// for an effect (In this case, there are only 2 shaders for this effect)
//
// Returns a vector of compiled bytecode for each shader in the effect
//
std::vector<std::string> compileShaders(
const std::string& sourceCode,
const RenderTargetLayout& layout);
//
// class ScaleDownEffect
//
// Scales image to 1/4 in each dimension by using two 1/2 passes
//
class ScaleDownEffect
{
public:
ScaleDownEffect(const TargetImage& targetImage)
: m_renderTarget(targetImage),
m_firstPassShader(
compileShaders(
ScaleDownEffectShaderSource,
m_renderTarget.getLayout()
)[0],
m_renderTarget.getWidth() / 2,
m_renderTarget.getHeight() / 2
),
m_secondPassShader(
compileShaders(
ScaleDownEffectShaderSource,
m_renderTarget.getLayout()
)[1],
m_renderTarget.getWidth() / 4,
m_renderTarget.getHeight() / 4
)
{
}
private:
RenderTarget m_renderTarget;
Shader m_firstPassShader;
Shader m_secondPassShader;
};
compileShaders()
是一个非常重量级的调用,我真的不认为在不需要时调用它两次是个好主意。
注意 正在初始化的三个对象都没有默认构造函数,因此在函数体中进行初始化并不是一个真正的选择。
我们怎么看?我有什么好的方法可以做到这一点,还是应该切换到智能指针并动态分配我包含的对象?
最佳答案
自 C++11 起,您可以使用委托(delegate)构造函数:
class ScaleDownEffect
{
ScaleDownEffect(const TargetImage& targetImage,
const std::vector<std::string>& shaders)
: m_renderTarget(targetImage),
m_firstPassShader(shaders[0],
m_renderTarget.getWidth() / 2,
m_renderTarget.getHeight() / 2),
m_secondPassShader(shaders[1],
m_renderTarget.getWidth() / 4,
m_renderTarget.getHeight() / 4)
{}
public:
ScaleDownEffect(const TargetImage& targetImage)
: ScaleDownEffect(targetImage,
compileShaders(ScaleDownEffectShaderSource,
targetImage.getLayout()))
{
}
private:
RenderTarget m_renderTarget;
Shader m_firstPassShader;
Shader m_secondPassShader;
};
关于c++ - 使用临时初始化多个成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48345273/