我在寫一個OpenGL C++包裝器。該包裝旨在減少複雜且易於使用的情況。如何讓C++編譯器知道一個函數是`Idempotent`
例如,我目前希望用戶只需要注意一點OpenGL Context
。爲此,我寫了一個類gl_texture_2d
。正如我們大家都知道,一個OpenGL texture
主要有以下操作:
- 設置它的U/V參數爲
repeat
/mirror
等 - 設置它的
min
/mag
filter
作爲linear
- .. 。
在此基礎上,我們有:
class gl_texture_2d
{
public:
void mirror_u(); // set u parameter as mirror model
void mirror_v(); // set v parameter as mirror model
void linear_min_filter(); // ...
void linear_mag_filter(); // ...
};
那麼,我們知道,只有當the handle of OpenGL texture object
目前綁定到OpenGL context
,我們才能執行這些操作。 假設我們有一個函數做到這一點: void bind(GLuint htex); //實際上相關GL功能的別名
好了,現在我們可以設計我們的gl_texture_2d
用法:
gl_texture_2d tex;
bind(tex.handle());
tex.mirror_u();
tex.linear_min_filter();
unbind(tex.handle());
它證實了GL的邏輯,但它失去了包裝的顯著,對不對?作爲一個用戶,我希望像操作:
gl_texture_2d tex;
tex.mirror_u();
tex.linear_min_filter();
爲了實現這一目標,我們必須都實現的功能:
void gl_texture_2d::mirror_u()
{
glBindTexture(GL_TEXTURE_2D, handle());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glBindTexture(GL_TEXTURE_2D, 0);
}
總是在做綁定操作內部可確保操作是有效的。但成本很高!
的代碼:
tex.mirror_u();
tex.mirror_v();
將擴大到一對無意義的綁定/解除綁定操作。
那麼,有沒有機制,使編譯器可以知道:
- 如果
bind(b)
緊跟bind(a)
,該bind(a)
可以被刪除; - 如果
bind(a)
在塊中出現兩次,則最後一次不起作用。