你可能很熟悉
boost::typeindex::type_id<T>().pretty_name()
或各种自动“枚举到字符串”。这些用途
__PRETTY_FUNCTION__
/
__FUNCSIG__
以获得“pretified”函数名(包括完整地写出模板参数)。使用它,我们可以获得模板参数的名称:
template<typename T>
void test() {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
template<auto V>
void test() {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
int main() {
test<std::string>();
enum { a };
test<a>();
}
// GCC output
void test() [with T = std::__cxx11::basic_string<char>]
void test() [with auto V = main::a]
您可以删除相应的字符以获得所需的“名称”。
在C++20之前,指针/引用非类型模板参数必须指向完整的对象。在C++20中,它们现在可以指向子对象。因此,您创建一个对象并指向它:
struct S
{
int i = 1;
double d = 2;
std::string this_is_the_name_we_want = "three";
};
extern S fake_object;
template<auto* P>
void test() {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
int main() {
test<&fake_object.this_is_the_name_we_want>();
}
// GCC output
void test() [with auto* P = (& fake_object.S::this_is_the_name_we_want)]
(您可以使用与相同的方法获得对每个成员的引用
boost::pfr::for_each_field
)