0

我编写了这段代码来获取指针传递的函数的类型:

import std.stdio;
import std.traits;

void main()
{
  get_param_types(&f1,"f1");
  get_param_types(&f2,"f2");
  get_param_types(&f3,"f3");
}

void get_param_types(f_t)(f_t f, string f_id){
  writeln("get_param_types ");
  alias ParameterTypeTuple!(f) ptt;
  writeln(f_id, " has ", ptt.length, " parameters");
  static if (ptt.length){
    write("( ");
    foreach (pt; ptt){
      write(typeid(pt), " ");
    }
    writeln(")");
  }
}

void f1() { }
void f2(int x) { }
void f3(int x, double y, string z) { }

我的疑问是:1:get_param_types在编译时完全评估?

如果没有:2:我怎样才能做到这一点?

当我在做的时候...... 3:有没有办法避免传递字符串(例如)并在编译时"f1"从内部推断它们?get_param_types

4

2 回答 2

3

foreach 将在编译时扩展,但代码执行(如运行时只有像 write 这样的函数)可以推迟到运行时

这类似于循环展开,但这里不是使用计数器而是每次迭代都有唯一的类型

于 2012-09-20T18:52:24.273 回答
1
  1. get_param_types()在您的示例中是在运行时评估的,因为您在运行时在main(). 请注意,它不能在编译时按原样进行评估,因为您正在调用 write() 和 writeln() 来写入stdout,这在编译时不可用。
  2. 你想在编译时实现什么?write在您的示例中,所有对and的调用writeln只能在运行时发生。foreachand是在编译时评估的static if...基本上任何对该函数的调用都会在运行时调用writeand的组合writeln- 没有循环或条件 - 这是你想要的吗?
  3. 您可能想查看模板别名参数。它们看起来有点像这样:
void getParamTypes(alias fn)() if (isCallable!fn)
{
    writefln("Getting parameter types for fn: %s", (&fn).stringof[2..$]);
    foreach (param; ParameterTypeTuple!fn) {
        writeln(param.stringof);
    }
}
于 2012-09-20T16:31:55.930 回答