gpt4 book ai didi

D 特征 - 完整数据成员列表

转载 作者:行者123 更新时间:2023-12-04 18:06:23 27 4
gpt4 key购买 nike

我正在尝试使用以下代码从类中获取完整数据成员的列表:

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 ,它将被保存为“堆栈”上的字符串元组,成为运行时值,因此无法在编译时评估 __traits .
  • 您需要使用 foreach而不是 for . foreach元组上的特殊之处在于它会静态展开,因此索引(和值)可以被 __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);
    }
    }

    关于D 特征 - 完整数据成员列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26226370/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com