Вы можете воспользоваться преимуществом препроцессора и использовать __PRETTY_FUNCTION__
в GCC и Clang или __FUNCTION__
в Visual C ++.
#include <iostream>
#include <string>
class Base {
public:
virtual std::string getName();
};
std::string Base::getName() {
return __PRETTY_FUNCTION__;
}
class Derived : public Base {
public:
std::string getName() override {
return __PRETTY_FUNCTION__;
}
};
int main(int argc, char **argv) {
Derived d;
std::cout << d.getName() << "\n";
return 0;
}
К сожалению, они возвращают полное имя метода, в приведенном выше примере выводит
virtual std::__cxx11::string Derived::getName()
и, если вам это нужно, вы можете реализовать вспомогательную функцию в Base
, которая будет извлекать имя класса между последним ::
и пробелом.
std::string getName() override {
return extractClassName(__PRETTY_FUNCTION__);
}