如何在C++中获得一个类名加函数名但没有args,能够处理模板函数,C函数,静态函数等?

jm81lzqq  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(180)

此问题在此处已有答案

How can I get the class name from a C++ object?(10个答案)
How to print the current filename with a function defined in another file without using macros? [duplicate](1个答案)
What advantages does C++20's std::source_location have over the pre-defined macros FILE, LINE and FUNCTION?(3个答案)
4天前关闭。
嗨,我知道这是一个老主题:如何获得c函数名。但是我真的没有看到一个满意的答案。
我使用的是c
17,所以c++20功能不适用于我。
我需要一个可靠的方法,能够打印“class_name::func_name()”的类内函数(静态和示例方法),和“func_name()”的c风格的函数。
该方法必须处理所有类型的情况:
1.样板函式。
1.跳过所有的参数。有时一个参数中会有“()”,例如,一个类型为std::function<void()>的参数,所以很难解析。
1.静态函数和示例函数
1.嵌套类
我尝试了__PRETTY_FUNCTION____FUNCTION____func__,并尝试用一些代码解析它们。我没有看到一种真正适用于所有情况的方法。
谢谢.

4bbkushb

4bbkushb1#

你可以使用std::source_location来获得一个实现定义的字符串,描述函数名等。
范例:

#include <iostream>
#include <source_location>

void log(std::ostream& os = std::cout,
         const std::source_location loc = std::source_location::current())
{
    os << loc.file_name() << '(' << loc.line() << "): "
       << loc.function_name() << '\n';
}

class Foo {
public:
    void func() const {
        log();
    }
};

int main() {
    log();
    
    Foo f;
    f.func();
}

字符串
可能的输出(gcc和llvm在本例中恰好一致):

/app/example.cpp(16): int main()
/app/example.cpp(11): void Foo::func() const


Demo
在C++17中,如果使用标准库的gcc实现,可以使用experimental/source_location

#include <experimental/source_location>
#include <iostream>

void log(std::ostream& os = std::cout,
         const std::experimental::source_location loc =
             std::experimental::source_location::current())
{
    os << loc.file_name() << '(' << loc.line() << "): "
       << loc.function_name() << '\n';
}

class Foo {
   public:
    void func() const { log(); }
};

int main() {
    log();

    Foo f;
    f.func();
}

相关问题