2012-07-18 63 views
2

我正在使用「廢棄」處理我的OpenGL工作,並且我厭倦了爲glclrtexAttribPointer等funclions創建cast(GLvoid*) Vec3.sizeof。所以我想我會成爲一個功能,glsizeof將用戶定義的屬性添加到D中的所有類型中

import std.stdio; 

alias void GLvoid; 

struct Vec3 { 
    float x, y, z; 
} 

GLvoid* glsizeof(T)(T t) { 
    return cast(GLvoid*) t.sizeof; 
} 

void main() { 

    Vec3 vec = { x: 2.5, y: 4.8, z: 3.2 }; 

    writeln(cast(GLvoid*) vec.sizeof); // prints 'C' 
    writeln(cast(GLvoid*) Vec3.sizeof); // prints 'C' 
    writeln(cast(GLvoid*) int.sizeof); // prints '4' 


    // Now to try using glsizeof :) 

    GLvoid* size_vec = vec.glsizeof; // call glsizeof using a uniform function call 
    GLvoid* size_vec3 = Vec3.glsizeof; 
    GLvoid* size_int = int.glsizeof; 

    writeln(size_vec); // should print 'C' 
    writeln(size_vec3); // should print 'C' 
    writeln(size_int); // should print '4' 
} 

我得到這個錯誤:

test.d(25): Error: no property 'glsizeof' for type 'Vec3' 
test.d(26): Error: no property 'glsizeof' for type 'int' 

有沒有辦法將屬性添加到類型?或者我可以以其他方式做到這一點,例如使用別名?或者我試圖做不可能的事情?

這是012aste的the code DPaste。

編輯:添加了一些關於我的預期輸出的更多細節。

回答

7

簡答:沒有。您不能將類型傳遞給函數,只能將模板傳遞給模板,並且如果要將某個屬性添加到某個東西,則需要聲明屬性函數。

不過,既然你可以一個類型傳遞給一個模板,你可以聲明

template glsizeof(T) 
{ 
    enum glsizeof = cast(GLvoid*)T.sizeof; 
} 

,然後你可以做

GLvoid* size_vec3 = glsizeof!Vec3; 
GLvoid* size_int = glsizeof!int; 

所以,只要你不挑剔關於使用語法Type.glsizeof,你有一個解決方案。如果你挑剔它,然後抱歉,但你運氣不好。您可以爲您定義的每種類型定義glsizeof。例如

struct S 
{ 
    enum glsizeof = cast(GLvoid*)S.sizeof; 
} 

但不會對你不定義任何類型,包括工作內置類型。

+0

乾杯!我更新了我的用例(我應該把'GLvoid *'而不是'GLsizei'),但答案保持不變。替代品不是太糟糕 - 感謝包括他們。 :) – bjz 2012-07-18 06:49:35

+0

好的。我更新了我的答案,但實際上我有點震驚,那是一個指針,更不用說'void *'了。並且將一個大小轉換爲指針對我來說似乎是_really_,但我對您使用的API一無所知。 – 2012-07-18 06:57:32

+0

作爲一個C API的OpenGL有很多奇怪的函數參數,並傳播到廢棄綁定。這就是爲什麼我想把它從大部分代碼中抽象出來的原因。 – bjz 2012-07-18 07:17:58

相關問題