我正在使用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。
编辑:在我的预期输出上添加了更多细节。
答案 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。