首页 > 解决方案 > C++ 从模板中获取函数名

问题描述

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

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,但我不知道如何实现 Args... Part in Makros。你知道如何解决这个问题吗?我想避免使用 RTTI。

标签: c++templates

解决方案


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


推荐阅读