D特征-完整数据成员列表
我试图使用以下代码从类中获取整型数据成员列表:D特征-完整数据成员列表,d,typetraits,ctfe,D,Typetraits,Ctfe,我试图使用以下代码从类中获取整型数据成员列表: import std.stdio; import std.traits; class D { static string[] integralMembers = getIntegralMembers(); static string[] getIntegralMembers() { auto allMembers = __traits(allMembers, D); string[] t
import std.stdio;
import std.traits;
class D
{
static string[] integralMembers = getIntegralMembers();
static string[] getIntegralMembers()
{
auto allMembers = __traits(allMembers, D);
string[] tmp = new string[allMembers.length];
int ct = 0;
for(int i = 0; i != allMembers.length; ++i) {
bool isInteg = __traits(isIntegral, __traits(getMember, D, allMembers[i]));
if(isInteg) {
tmp[ct++] = allMembers[i];
}
}
string[] ret = new string[ct];
for(int i = 0; i != ct; ++i) {
ret[i] = tmp[i];
}
return ret;
}
int a;
this() { }
~this() { }
}
void main()
{
auto integralMembers = D.integralMembers;
foreach(mem; integralMembers)
{
writeln(mem);
}
}
但是,编译失败,出现以下错误:
main.d(17): Error: variable i cannot be read at compile time
main.d(17): Error: expression expected as second argument of __traits getMember
main.d(19): Error: variable i cannot be read at compile time
main.d(7): called from here: getIntegralMembers()
如何编译此代码?即使该函数仅在该程序的编译过程中运行,它也必须作为可在运行时运行的函数进行编译
allMembers
声明为清单常量:
enum allMembers = __traits(allMembers, D);
allMembers
是一个元组。如果使用auto
,它将保存为“堆栈”上的字符串元组,成为运行时值,因此无法对\uu traits
进行编译时计算foreach
而不是for
<元组上的code>foreach的特殊之处在于它将静态展开,因此索引(和值)将可供\uu traits
访问import std.stdio;
import std.traits;
class D
{
static string[] integralMembers = getIntegralMembers();
static string[] getIntegralMembers()
{
enum allMembers = __traits(allMembers, D);
string[] tmp = new string[allMembers.length];
int ct = 0;
foreach(i, member; allMembers) {
bool isInteg = __traits(isIntegral, __traits(getMember, D, member));
if(isInteg) {
tmp[ct++] = allMembers[i];
}
}
string[] ret = new string[ct];
for(int i = 0; i != ct; ++i) {
ret[i] = tmp[i];
}
return ret;
}
int a;
this() { }
~this() { }
}
void main()
{
auto integralMembers = D.integralMembers;
foreach(mem; integralMembers)
{
writeln(mem);
}
}