是否有可能在编译时获得包含命名空间和类名的字符串?

Duc*_*een 8 c++ boost class c++03

我不知道如何界定,将在格式定的类名称输出其命名空间和类名像宏:"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*/);
Run Code Online (Sandbox Code Playgroud)

我想让str成为"NS.SNS.MyClass".如果可能的话,我希望那个宏有fiew params(意思是一个或没有).

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

string NS::SNS::MyClass::str = GetTypeNameFormater<NS::SNS::MyClass>();
Run Code Online (Sandbox Code Playgroud)

怎么做这样的事情(使用boost,stl并且手头只有C++ 03)?

pmr*_*pmr 3

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

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

http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html给出了如何做到这一点的示例。这应该适用于 clang 和 OS X。

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

这两种选择都不会特别漂亮。