【问题标题】:Custom RTTI information using templates使用模板自定义 RTTI 信息
【发布时间】:2016-04-30 14:47:42
【问题描述】:

我有 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 和方法的名称​​Method。由于 SpiderMonkey 的 API 的性质,我无法更改 ExecuteMethod 的参数,只能更改模板。

我见过这些:

C++ Get name of type in template

C++ Template Specialization with Constant Value

我已经尝试过这些,但是在 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&lt;&gt; class TypeParseTraits&lt; X &gt;?覆盖?专业?

如果我再通过模板来做,就必须依赖jsType、Type和Method。

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

我知道简单的 char* 不能作为模板的参数。

谢谢。

【问题讨论】:

  • “这是什么template&lt;&gt; class ...?”这是一个模板专业化。
  • typeid 为什么以及如何失败?
  • 不清楚自定义 RTTI 信息应该是什么。没有 IIRC 这样的东西。
  • “我需要知道类型的名称和方法的名称。”
  • 假设我有这个:template &lt;typename jsType, AIErr(*Type::*Method)()&gt; static bool ExecuteMethod(JSContext *cx, unsigned argc, JS::Value *vp) { const char* jst = typeid(jsType).name(); const char* t = typeid(Type).name(); const char* m = typeid(Method).name(); const type_info&amp; jsti = typeid(jsType); const type_info&amp; ti = typeid(Type); const type_info&amp; mi = typeid(Method);,方法名称将不会被检索,或者我不知道如何。

标签: c++ templates rtti


【解决方案1】:

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

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

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

  • 结构或类中可以有静态 const char* 数据
  • 可以借助模板填充此数据
  • 可以将此类结构作为模板参数传递并提取静态数据
  • 如果成员是 constexpr,则可以手动填充此类字符串(虽然会有一些惩罚)

因此,您可以使用类型(可能是模板)将 char*s 传递给其他模板。

例子:

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>>();

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2013-11-05
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2015-10-30
    • 2011-12-18
    相关资源
    最近更新 更多