gpt4 book ai didi

c++ - 是否有可能在编译时得到一个包含命名空间和类名的字符串?

转载 作者:可可西里 更新时间:2023-11-01 17:56:55 27 4
gpt4 key购买 nike

我想知道如何定义一个宏来为给定的类名输出其命名空间和类名,格式如下:“Namespace.SubNamespace.ClassName”?

所以写这样的东西:

// MyClass.h
#include <string>

namespace NS {
namespace SNS {
class MyClass {
static std::string str;
};
}
}

//MyClass.cpp
#include <MyClass.h>
using namespace std;
string NS::SNS::MyClass::str = SUPER_MACRO(/*params if needed yet none would be prefered*/);

我想让 str 成为“NS.SNS.MyClass”。如果可能的话,我希望宏有尽可能少的参数(意思是一个或没有)。

或者我想知道这样的事情是否可以使用类似这样的模板来完成:

string NS::SNS::MyClass::str = GetTypeNameFormater<NS::SNS::MyClass>();

如何做这样的事情(使用 boost、STL 并且手头只有 C++03)?

最佳答案

没有标准的方法可以做到这一点。提供范围信息的唯一标准宏是 C99 宏 __func__

不过,您可以做的是通过 std::typeinfo 获取符号的名称,然后将其放入特定于编译器的 demangling API 中,然后解析出命名空间。

http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html举例说明如何做到这一点。这应该适用于 clang 和 OS X。

或者,您可以编写一组宏来定义命名空间和相应的静态字符串,然后从那里将您的字符串组合在一起。

这两个选项都不会特别漂亮。

关于c++ - 是否有可能在编译时得到一个包含命名空间和类名的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20325960/

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