c++ - 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++2y( 23?)最早)。
推荐阅读
- firebase - 如何设置规则以便将文档写入受 uid 保护的 Firestore?
- tensorflow - Tensorflow Object Detection API - 检测未戴头盔的人
- javascript - 展开和折叠 HTML 表格
- c++ - 从 std::string 移出的不必要的清空
- python - 如果我在 pyspark 中使用类方法作为 udf 会发生什么?
- node.js - Multer 没有保存到指定的目的地
- json - 如何创建通过嵌套 JSON 对象循环的动态内容?
- alasql - 如何初始化 alasql 数据库?
- sql-server - 如何在其他服务器的视图上创建模式绑定和索引?
- r - 在 r 中的组级别分配 1:5 组 id