D で C スタイルの sizeof() 関数を実装したいと考えています (.sizeof については知っていますが、多くの C (C99) を移植するのに役立ちます)。
コンパイル時に実行できるようにしたいのは明らかで、型または式を引数として取ります。理想的には、独自のテンプレート呼び出し構文を使用するのではなく、可能であれば、C と同じ構文を使用したいと考えています。これにより、その有用性が大幅に向上します。これはまったく可能ですか?
私の理解が正しければ、size
以下の関数と同様の動作が必要ですか?
size2
はランタイム関数になりますが、これはもちろん D では少し無意味です。ただしsize2
、CT でenum val = size2(2 + 2);
. これは役に立ちますか?
template size(T)
{
enum size = T.sizeof;
}
// for expressions
template size(alias T)
{
enum size = T.sizeof;
}
auto size2(T)(T x)
{
return T.sizeof;
}
void main(string[] args)
{
import std.stdio : writeln;
writeln(size!int); // 4
writeln(size!long); // 8
writeln(size!(1 + 1)); // 4
writeln(size2(2)); // 4
writeln(size2(2L)); // 8
writeln(size2(2 + 2)); // 4
}