C++ - 类似于Python中with关键字的东西

3

我有一些关于OpenGL着色器的抽象概念,我希望可以这样使用它们:

WITH_SHADER(shader_name) {
 // here will be gl commands
}

它应该自动将着色器从当前的gl上下文中绑定/解绑。

在这个复合语句之前绑定,之后解绑。

我能在C++中以某种方式构造这个宏吗?


你可以构建这样的宏。我曾经这么做,认为会很有用。但是自那以后,它从未被使用过。但如果你想尝试一下,注意在C++中,“bind”和“unbind”分别映射到构造和销毁。所以你只需要一个宏来声明一个实际上“无名”的(没有名称冲突)局部变量。if和while是引入这种局部作用域的好结构。 - Cheers and hth. - Alf
一个替代 WITH_SHADER(blah blah) 的方法是简单地声明 Shader blahshader_usage; - Cheers and hth. - Alf
1个回答

14

最接近的东西可能是RAII

创建一个名为 WithShader 的类,它封装了您的着色器:

  • 在构造函数中绑定着色器
  • 在析构函数中解绑它

使用示例:

{
  with_shader ws(shader_name)
  // use your shader
}
// binding and unbinding occured automatically, thats RAII.

注意:

RAII一般不是简单的,要注意复制和赋值构造函数。


看起来很酷,但我不确定那个析构函数是否立即执行,这可能会成为问题,我必须检查一下。 - Krab
4
代码被括号包围,这将确保在到达结束括号时执行析构函数。 - JBentley
1
这是常用于作用域互斥锁(以及任何作用域对象)的模式。 - aruisdante
1
在我看来,RAII类应该删除它们的复制构造函数和赋值运算符,以防止一些隐藏的错误。 - Mike DeSimone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接