出于调试目的,我想从模板参数中提取函数的名称。但是我只得到函数签名而不是实际名称。
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/