将用户定义的属性添加到D中的所有类型

时间:2012-07-18 06:05:32

标签: types casting d alias

我正在使用Derelict来完成我的OpenGL工作,而且我已经厌倦了所有的时间cast(GLvoid*) Vec3.sizeof以获得像glVertexAttribPointer这样的功能。所以我想我会创建一个函数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的the code

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

2 个答案:

答案 0 :(得分:7)

简答:不。您不能将类型传递给函数,只传递模板,如果要向某些东西添加属性,则需要声明属性函数。

但是,由于可以将类型传递给模板,因此您可以声明

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

然后你可以做

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

所以,只要你不吝啬使用语法Type.glsizeof,你就有了解决方案。如果你 挑剔它,那很抱歉,但你运气不好。您可以为您定义的每种类型定义glsizeof。 e.g。

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

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

答案 1 :(得分:2)

UFCS目前无法添加静态方法。请参阅D新闻组中的this conversation