2012-07-18 5 views
2

OpenGL 작업에 Derelict를 사용하고 있으며 glVertexAttribPointer와 같은 funclions에 대해 항상 cast(GLvoid*) Vec3.sizeof이 필요합니다.모든 유형의 사용자 정의 속성 추가 D

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

유형에 속성을 추가 할 수있는 방법이 있나요 : 그래서

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' 
} 

glsizeof 나는이 오류가 나는 기능을 할 줄 알았는데? 또는 별칭을 사용하여 다른 방법으로이 작업을 수행 할 수 있습니까? 아니면 내가 불가능한 일을하려고하는거야?

여기에 DPaste의 the code이 있습니다.

편집 : 내 예상 출력에 대한 자세한 내용을 추가했습니다.

답변

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

건배! 나는 유스 케이스를 업데이트했다. (GLsize *가 아닌 GLsizei를 넣어야한다.)하지만 그 대답은 변함이 없다. 대안을 포함시켜 주셔서 감사합니다. :) – bjz

+0

오케이. 내 대답을 업데이 트했지만, 사실 포인터가 작동한다는 사실에 조금 놀랐습니다.'void * '는 말할 것도 없습니다. 그리고 포인터에 크기를 캐스팅하는 것은 나에게 너무 드물게 보이지만 사용중인 API에 대해서는 아무 것도 모른다. –

+0

OpenGL이 C API가되면 이상한 함수 매개 변수가 많이 생겨서 Derelict 바인딩으로 전파됩니다. 그래서 대부분의 코드에서 추상화하려고합니다. – bjz

2

UFCS는 현재 정적 방법을 추가 할 수 없습니다. D 뉴스 그룹의 this conversation을 참조하십시오.