gpt4 book ai didi

c++ - 是否可以获取传递给模板的函数的名称?

转载 作者:太空狗 更新时间:2023-10-29 21:31:53 24 4
gpt4 key购买 nike

我尝试在运行时获取传递给模板化类方法的类方法的名称。我想知道更好的跟踪输出的名称。

这个问题源于我之前提出的问题: Templated wrapper method for other class methods

我试图通过添加来获取名称

typeid(func).name()

但结果并不令人满意,因为函数名称总是打印为 *,请参见下面的示例。

我还尝试了不同的编译器(msvc、gcc)和 demangle 选项(abi::__cxa_demangle),但结果总是或多或少相同。

#include <algorithm>
#include <functional>
#include <iostream>

class A
{
public:
void foo(int x) {
std::cout << "Foo: " << x << std::endl;
}

void bar(int x, float y) {
std::cout << "Bar: " << x << ", " << y << std::endl;
}
};

class B
{
public:
void fooAndMore(int x) {
foobarWrapper(&A::foo, x);
}

void barAndMore(int x, float y) {
foobarWrapper(&A::bar, x, y);
}

template<typename T, typename... Args>
void foobarWrapper(T func, Args&&... args)
{
std::cout << "Start!" << std::endl;

auto funcName = typeid(func).name();
std::cout << "Functionname: " << funcName << std::endl;

auto caller = std::mem_fn( func);
caller( A(), args...);

std::cout << "End!" << std::endl;
}
};

int main()
{
B b;
b.fooAndMore(1);
b.barAndMore(2, 3.5f);
}

我期待这样的事情:

Start!
Functionname: void (__thiscall A::foo)(int)
Foo: 1
End!
Start!
Functionname: void (__thiscall A::bar)(int,float)
Bar: 2, 3.5
End!

实际结果:

Start!
Functionname: void (__thiscall A::*)(int)
Foo: 1
End!
Start!
Functionname: void (__thiscall A::*)(int,float)
Bar: 2, 3.5
End!

是否可以获取传递函数的真实名称?

提前致谢!

最佳答案

没有。 typeid 仅对多态对象(即具有虚函数的类类型的对象)进行 RTTI。对于所有其他类型,它只会为您提供有关静态类型的信息,在本例中为函数指针类型。 (多态对象的 typeid 利用 vtable 来完成它的工作,但是函数没有附加类似 vtable 的东西。)

对于此类调试/跟踪,您需要使用特定于平台的调试实用程序。

关于c++ - 是否可以获取传递给模板的函数的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56690314/

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