2

私は OpenGL の作業に Derelict を使用してい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のコードです。

編集:予想される出力に詳細を追加しました。

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 に答える