gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:13:15 45 4
gpt4 key购买 nike

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

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/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com