D:函数参数名称自省

D:函数参数名称自省,d,introspection,D,Introspection,给定D中的函数声明,是否可以在编译时内省任何函数参数名称的字符串表示形式,以便在自动函数反射中使用。 例如 是否可以在编译时注册函数提取“a”、“b”、“c”,就像traits(allMembers,someClass)可以为一个类注册一样?我认为stringof的一个用法给出了名称。你只需做一点工作就可以把它们解析出来。OTOH stringof定义不清,所以这有点脆弱 您可以使用std.traits.ParameterTypeTuple!()来获取参数的类型,但我不知道如何获取它们的名称标准

给定D中的函数声明,是否可以在编译时内省任何函数参数名称的字符串表示形式,以便在自动函数反射中使用。 例如


是否可以在编译时注册函数提取“a”、“b”、“c”,就像traits(allMembers,someClass)可以为一个类注册一样?

我认为stringof的一个用法给出了名称。你只需做一点工作就可以把它们解析出来。OTOH stringof定义不清,所以这有点脆弱

您可以使用
std.traits.ParameterTypeTuple!()
来获取参数的类型,但我不知道如何获取它们的名称<代码>标准特性正在不断改进,因此我的。很有可能的是,没有人考虑过这种特殊的需求,所以他们还没有添加它。我建议为它创建一个函数,他们很有可能会添加它。

我尝试在函数上使用stringof,但它只是抱怨无法使用给定的参数类型调用它。在函数调用中使用stringof会导致函数调用的字符串及其参数,而不是参数的名称。所以,如果有办法让stringof给你函数参数的名称,我不知道它是什么。@Jonathan:你必须对类型应用
stringof
。也就是说,如果您定义
void register\u函数(T)(tf){auto a=T.stringof;}
,则调用
register\u函数(&foo)给出
a==“无效函数(int a,double b,string c)”
。BCS建议解析这个字符串(确实有点脆弱)。感谢您的帮助。如果通过alias模板参数传递函数,那么别名上的stringof将给出一个错误,但是使用上面指出的类型确实会给出完整的字符串,然后我将手动解析该字符串。如果类型很复杂或声明仅包含类型,则手动解析字符串很困难。我用它在更高级别的接口中自动注册函数,该接口可使用命名函数参数调用。@John:手工调用参数名称可能值得一试。首先,这将允许您在不修改代码的情况下将名称更改为干净的名称。您需要它做什么?我看不出您的示例有什么要求。请确实提出增强请求!这对于创建像Boost.Python或luabind这样的绑定库非常有用。因为我没有看到John为此创建增强请求的迹象,所以我创建了一个:非常感谢您为我提出这个请求。
void foo(int a, double b, string c) { }
register_function!(foo)()