【发布时间】: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<> class TypeParseTraits< X >?覆盖?专业?
如果我再通过模板来做,就必须依赖jsType、Type和Method。
我的问题是,我应该如何使用字符串实现(即使仅用于调试)RTTI 信息?如果有的话,最有效的选择是什么?
我知道简单的 char* 不能作为模板的参数。
谢谢。
【问题讨论】:
-
“这是什么
template<> class ...?”这是一个模板专业化。 -
typeid为什么以及如何失败? -
不清楚自定义 RTTI 信息应该是什么。没有 IIRC 这样的东西。
-
“我需要知道类型的名称和方法的名称。”
-
假设我有这个:
template <typename jsType, AIErr(*Type::*Method)()> 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& jsti = typeid(jsType); const type_info& ti = typeid(Type); const type_info& mi = typeid(Method);,方法名称将不会被检索,或者我不知道如何。