这个问题 https://stackoverflow.com/questions/6151558/displaying-fully-qualified-name-of-the-function描述了如何使用__PRETTY_FUNCTION__
获取函数的全名,包括其返回类型、参数类型、命名空间和模板参数。
考虑以下漂亮的函数:
namespace foo {
namespace {
template<int i>
int (*bar(int (*arg)(int *)))(int *) {
printf("%s\n", __PRETTY_FUNCTION__);
return arg;
}
} // anonymous namespace
} // namespace foo
如果您不明白,该函数接受并返回一个指向int *
-> int
功能。
它漂亮的名字是,当编译时g++
(4.9),
int (* foo::{anonymous}::bar(int (*)(int*)))(int*) [with int i = 1337]
与clang++
(3.5),
int (*foo::(anonymous namespace)::bar(int (*)(int *)) [i = 1337])(int *)
这些字符串非常不适合测试该函数是否是某个命名空间的一部分。有没有其他方法,或者编译器提供的库来解析这些字符串?
为了澄清一下,我宁愿有类似的东西
foo::{anonymous}::bar <I don't care about anything beyond this point>
更理想的是,我想要一种编译时方式,例如constexpr
功能split(__PRETTY_FUNCTION__)
产生某种列表
- 完全限定函数名
- 返回类型
- arg0 的类型
- arg1 的类型
等等,但我对完全限定的函数名称很满意。
经过更仔细的观察,我写了这段代码:
template <typename InputIterator, typename T>
InputIterator findClosing( InputIterator first, InputIterator last, T close )
{
if (first == last)
return last;
auto open = *first;
unsigned counter = 1;
while (++first != last)
{
if (*first == close && --counter == 0)
return first;
if (*first == open)
++counter;
}
return last;
}
template <std::size_t N,
std::size_t N2>
std::string f(char const(&str)[N], char const(&name)[N2])
{
using namespace std;
// Argument to isalnum must be unsigned:
auto cond = [] (unsigned char c) {return !isalnum(c) && c != '_';};
auto iter = str;
for (;;++iter)
{
iter = search( iter, end(str),
begin(name), end(name)-1 );
if (iter == end(str))
throw invalid_argument("");
if ((iter == begin(str) || cond(iter[-1]))
&& (iter == end(str) - N2 || (cond(iter[N2-1]) && iter[N2-1] != ':')))
break;
}
auto origin_iter = iter;
while(iter != begin(str))
{
--iter;
for (auto p : {"()", "{}"})
if (*iter == p[1])
iter = findClosing(reverse_iterator<char const*>(iter+1),
reverse_iterator<char const*>(begin(str)),
p[0]).base()-2;
if (cond(*iter) && *iter != ':')
return string(iter+1, origin_iter+N2-1);
}
return string(iter, origin_iter+N2-1);
}
它应该适用于任何函数,假设不存在不必要的空格__PRETTY_FUNCTION__
and __func__
仅包含非限定函数名称。
Demo http://coliru.stacked-crooked.com/a/e1237fdf0bd06c1e.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)