C++ 从模板中获取函数名称

标签 c++ templates

出于调试目的,我想从模板参数中提取函数的名称。但是我只得到函数签名而不是实际名称。

namespace internal
{
static const unsigned int FRONT_SIZE = sizeof("internal::GetTypeNameHelper<") - 1u;
static const unsigned int BACK_SIZE = sizeof(">::GetTypeName") - 1u;

template<typename T>
struct GetTypeNameHelper
{
    static const char* GetTypeName(void)
    {
#ifdef __GNUC__
        static const size_t size = sizeof(__PRETTY_FUNCTION__);
        static char typeName[size] = { };
        memcpy(typeName, __PRETTY_FUNCTION__, size - 1u);
#else
        static const size_t size = sizeof(__FUNCTION__) - FRONT_SIZE - BACK_SIZE;
        static char typeName[size] =
        {};
        memcpy(typeName, __FUNCTION__ + FRONT_SIZE, size - 1u);
#endif //__GNUC__

        return typeName;
    }
};
} //namespace internal

template<typename T>
const char* GetTypeName(void)
{
    return internal::GetTypeNameHelper<T>::GetTypeName();
}


从自己的 make 函数中调用它

template<typename Func_T, typename ... Args>
CExtended_Function<Args...> Make_Extended_Function(Func_T f)
{
    std::function<void(Args...)> func(f);
    const char* pFunc_Name = NCommonFunctions::GetTypeName<Func_T>();

    CExtended_Function<Args...> res(f, func_name);

    return res;
}

void Test_Func();

void foo()
{
   Make_Extended_Function(Test_Func);
}

只给我函数签名。

... [使用 T = void (*)()]...

但是我想获取函数名称(在本例中为“Test_Func”)

我考虑过使用 makros,但我不确定如何在 Makros 中实现 Args... 部分。你知道如何解决这个问题吗?我想避免使用 RTTI。

最佳答案

函数不是有效的模板参数 - 这里的模板参数是函数指针的类型,而不是函数本身 - 所以这是完全不可能的。在编译时也没有可移植的方法来获取特定函数的名称,至少目前是这样(这可能在未来通过编译时反射成为可能,但这将是 C++2y( 23?)最早)。

关于C++ 从模板中获取函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57226529/

相关文章:

c++ - 使用一个数组以相反的顺序制作另一个数组

c++ - 如何用QAbstractItemDelegate的画图在QListVIew的单元格中心设置QRect?

c++ - 模板类的专用构造函数

templates - 如何在 Umbraco 的页面上显示母版页的属性

c++ - 不知道类型时调用模板方法

c++ - 使用 '='运算符在C++中使两个数组相等

c++ - 库构建器的预编译头文件用法

c++ - 在哪里使用带翻译单元的声明,在 namespace 内部还是外部?

c++ - 专门针对指向数据成员的指针的模板成员函数

C++ 模板<运算符>