使用模板自定义 RTTI 信息

Custom RTTI information using templates

本文关键字:RTTI 信息 自定义      更新时间:2023-10-16

我有SpiderMonkey API的包装类,我需要在其中定义具有特定签名的方法。我有一个基于模板的解决方案。基本上,我有几个模板方法来处理数百个包装器方法,如下所示(简化):

template <typename jsType, AIErr(*Type::*Method)()>
    static bool ExecuteMethod(JSContext *cx, unsigned argc, JS::Value *vp)
{
...
}

我使用宏按如下方式使用它:

#define EXECUTE_METHOD_AIERR_X(TYPE, METHOD) 
JS_FN(#METHOD, (js##TYPE::ExecuteMethod<js##TYPE, &TYPE::METHOD>), 0, 0)

如果我遇到需要调试的情况,为了知道在特定时间处理了哪个类(*Type)的哪个方法(*Method),我需要知道类型Type的名称以及该模板方法中方法的名称。由于SpiderMonkey的API的性质,我不能改变ExecuteMethod的参数,只能改变模板。

我见过这些:

C++ 获取模板中的类型名称

C++ 具有常量值的模板专用化

我已经尝试过这些,但解决方案在 MSVC C++ 2013 编译器的typeid(T).name()步骤中对我来说失败了。另一方面,如何在方法上应用它?

此外,我看到这个:

template<typename T>
class TypeParseTraits{
public:
    static const std::string name(){
        return typeid(T).name();
    }
};
#define REGISTER_PARSE_TYPE(X) 
    template<> class TypeParseTraits< X > 
    { public: static const std::string name(){ return #X; } };

这是什么template<> class TypeParseTraits< X >?覆盖?专业化?

如果我再次通过模板来执行此操作,则必须依赖于jsType,类型和方法。

我的问题是,我应该如何使用字符串实现(即使仅用于调试)RTTI 信息?如果有的话,最有效的选择是什么?

我知道简单的 char* 不是模板参数的选项。

谢谢。

"这个模板是什么<>类 TypeParseTraits?覆盖?专业化?- 它是模板的部分专业化。在这种特殊情况下,给定的宏确保使用"注册"类型实例化的 TypeParseTraits 模板将具有返回 const std::string 的方法名称,其中包含类型名称,用于代码中,而不是由 type_info.name() 返回的任何内容(这是实现定义的,通常难以理解)。

我的问题是,我应该如何使用字符串实现(即使仅用于调试)RTTI 信息?如果有的话,最有效的选择是什么?- RTTI 的最佳方法应该只是一些将返回例如字符串的虚拟方法。此方法应在所有派生类中重写(可以使用静态多态方法简化)并返回相应的信息。

我知道简单的字符不是模板参数的选项。 - 不是一般的,但是...

  • 可以在结构或类中包含静态常量字符*数据
  • 可以在模板的帮助下填写此数据
  • 可以将此类结构作为模板参数传递并提取静态数据
  • 如果成员是 constexpr,则可以手动填充此类字符串(尽管会受到一些处罚)

因此,您可以使用类型(可能是模板)将字符传递到其他模板中。

例:

template<class C>
struct Named { static const char* name; };
template<class C>
const char* Named<C>::name = typeid(C).name(); // fill as you wish
template<class N>
void print() { cout<< N::name <<endl;}
...
print<Named<int>>();