2

我将 Derelict 用于我的 OpenGL 工作,并且我厌倦了一直使用cast(GLvoid*) Vec3.sizeofglVertexAttribPointer 之类的函数。所以我想我会做一个功能,glsizeof

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'

有没有办法向类型添加属性?或者我可以用另一种方式做到这一点,例如使用别名?或者我想做的事情是不可能的?

这是DPaste 上的代码

编辑:在我的预期输出中添加了更多细节。

4

2 回答 2

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

但这不适用于您未定义的任何类型,包括内置类型。

于 2012-07-18T06:43:14.423 回答
2

UFCS 当前无法添加静态方法。请参阅D 新闻组上关于它的对话。

于 2012-07-18T06:36:24.513 回答