与我之前的问题有点相关
有没有办法从d中的函数或方法中获取调用Object?
例:
class Foo
{
public void bar()
{
auto ci = whoCalledMe();
// ci should be something that points me to baz.qux, _if_ baz.qux made the call
}
}
class Baz
{
void qux()
{
auto foo = new Foo();
foo.bar();
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
whoCalledMe存在吗?如果是这样,它叫什么?另外;
debug_backtrace?要扩展CyberShadow所说的内容,因为您可以通过使用__FUNCTION__获得函数的完全限定名称,您还可以使用mixin将函数作为符号获取:
import std.stdio;
import std.typetuple;
void callee(string file=__FILE__, int line=__LINE__, string func=__FUNCTION__)()
{
alias callerFunc = TypeTuple!(mixin(func))[0];
static assert(&caller == &callerFunc);
callerFunc(); // will eventually overflow the stack
}
void caller()
{
callee();
}
void main()
{
caller();
}
Run Code Online (Sandbox Code Playgroud)
堆栈将在这里溢出,因为这两个函数最终无限地递归地相互调用.
无法直接获取有关“呼叫者”的信息。您可能会幸运地从调用堆栈中获取地址,但这是一个低级操作,取决于诸如您的程序是否使用堆栈帧进行编译等因素。获得地址后,理论上您可以将其转换为函数名称和行号,前提是调试符号可用于程序的二进制文件,但是(同样)这是高度特定于平台的,并且取决于用于编译程序的工具链。
作为替代方案,您可能会发现这很有帮助:
void callee(string file=__FILE__, int line=__LINE__, string func=__FUNCTION__)()
{
writefln("I was called by %s, which is in %s at line %d!", func, file, line);
}
void caller()
{
// Thanks to IFTI, we can call the function as usual.
callee();
}
Run Code Online (Sandbox Code Playgroud)
但请注意,不能对非最终类方法使用此技巧,因为每次调用该函数都会生成一个新的模板实例(并且编译器需要事先知道类的所有虚拟方法的地址)。
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |