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

时间:2019-06-20 16:27:13

标签: c++ templates rtti typeid

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

该问题来自于我之前提出的问题: 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!

能否获得传递函数的真实名称?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

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

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