c ++静态方法和模板中的继承与重载
c++ static methods and inheritance in templates with overloading
这是我第一次post来这里,我已经找了几天的答案,所以我问了。
这是一个复杂的结构。我在 Illustrator 插件中嵌入了 SpiderMonkey javascript 引擎。 Illustrator 有一个复杂且有时不一致的 API。在这种情况下,我必须调用一个具有短类型作为参数的方法:
namespace ai
{
...
typedef signed short int16;
...
};
该方法在结构中被称为指针:
struct AIDocumentSuite {
...
AIAPI AIErr (*GetDocumentRulerUnits) ( ai::int16 *units );
...
};
但是,枚举是参数的来源:
enum AIDocumentRulerUnitValue {
kUnknownUnits = 0,
/** inches */
kInchesUnits,
/** centimeters */
kCentimetersUnits,
/** points */
kPointsUnits,
/** picas */
kPicasUnits,
/** millimeters */
kMillimetersUnits,
/** pixels */
kPixelsUnits,
/** Q units */
kQUnits
};
为了让 javascript 对象由 SpiderMonkey 管理,我将所有这些都包装在 classes 中。我在代码的某处有以下工作调用(有点简化,清理了测试和验证):
ai::int16 aiDocumentRulerUnitValue;
AIErr aiErr = sAIDocument->GetDocumentRulerUnits(&aiDocumentRulerUnitValue);
...
if (!jsAIDocumentRulerUnitValue::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, value))
return false;
...
jsProperty::SetProperty(cx, &obj, "value", value, true);
...
我的问题是 FromAIObject。
我有模板库class:
template<typename T> class jsBaseDataClass : public jsBaseClass
{
public:
...
template <typename jsT> static bool FromAIObject(JSContext *cx, T* aiObj, JSObject*& obj)
{
...
return true;
}
}
和派生的 class:
class jsAIDocumentRulerUnitValue : public jsBaseDataClass<AIDocumentRulerUnitValue>
{
public:
...
template <typename jsT> static bool FromAIObject(JSContext *cx, ai::int16* aiint16, JSObject*& obj)
{
AIDocumentRulerUnitValue aiDocumentRulerUnitValue = static_cast<AIDocumentRulerUnitValue>(*aiint16);
return jsEnumDataClass<jsBaseClass>::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, obj);
}
...
}
现在,问题:如果我写在后一个:
jsAIDocumentRulerUnitValue::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, obj);
它将尝试调用派生的 class 中的方法(参数类型为 ai::int16 = signed short)。
如果派生 class 中的方法不存在,它将调用父 class 中的方法,而不管第二个参数的类型。
我希望能够根据其参数寻找合适的方法。
这将使我在两种方法的每个派生 class 中都有一个副本(如果需要,或者至少是默认方法的副本)。
我哪里做错了,或者我怎样才能让它们表现得像继承的非静态方法重载?
谢谢。
你没有做错任何事。你的问题看起来像 stack overflow: inheritance and method overloading
的重复
除非您 using XXXX
,否则重载方法会丢失
做类似的事情。
class Base {
public:
static void method(std::string someParam);
}
class Derived : public Base {
public:
using Base::method;
static void method(int param);
}
重点是使用 using
关键字使基础 class 的函数可见。
这是我第一次post来这里,我已经找了几天的答案,所以我问了。 这是一个复杂的结构。我在 Illustrator 插件中嵌入了 SpiderMonkey javascript 引擎。 Illustrator 有一个复杂且有时不一致的 API。在这种情况下,我必须调用一个具有短类型作为参数的方法:
namespace ai
{
...
typedef signed short int16;
...
};
该方法在结构中被称为指针:
struct AIDocumentSuite {
...
AIAPI AIErr (*GetDocumentRulerUnits) ( ai::int16 *units );
...
};
但是,枚举是参数的来源:
enum AIDocumentRulerUnitValue {
kUnknownUnits = 0,
/** inches */
kInchesUnits,
/** centimeters */
kCentimetersUnits,
/** points */
kPointsUnits,
/** picas */
kPicasUnits,
/** millimeters */
kMillimetersUnits,
/** pixels */
kPixelsUnits,
/** Q units */
kQUnits
};
为了让 javascript 对象由 SpiderMonkey 管理,我将所有这些都包装在 classes 中。我在代码的某处有以下工作调用(有点简化,清理了测试和验证):
ai::int16 aiDocumentRulerUnitValue;
AIErr aiErr = sAIDocument->GetDocumentRulerUnits(&aiDocumentRulerUnitValue);
...
if (!jsAIDocumentRulerUnitValue::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, value))
return false;
...
jsProperty::SetProperty(cx, &obj, "value", value, true);
...
我的问题是 FromAIObject。
我有模板库class:
template<typename T> class jsBaseDataClass : public jsBaseClass
{
public:
...
template <typename jsT> static bool FromAIObject(JSContext *cx, T* aiObj, JSObject*& obj)
{
...
return true;
}
}
和派生的 class:
class jsAIDocumentRulerUnitValue : public jsBaseDataClass<AIDocumentRulerUnitValue>
{
public:
...
template <typename jsT> static bool FromAIObject(JSContext *cx, ai::int16* aiint16, JSObject*& obj)
{
AIDocumentRulerUnitValue aiDocumentRulerUnitValue = static_cast<AIDocumentRulerUnitValue>(*aiint16);
return jsEnumDataClass<jsBaseClass>::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, obj);
}
...
}
现在,问题:如果我写在后一个:
jsAIDocumentRulerUnitValue::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, obj);
它将尝试调用派生的 class 中的方法(参数类型为 ai::int16 = signed short)。
如果派生 class 中的方法不存在,它将调用父 class 中的方法,而不管第二个参数的类型。
我希望能够根据其参数寻找合适的方法。 这将使我在两种方法的每个派生 class 中都有一个副本(如果需要,或者至少是默认方法的副本)。
我哪里做错了,或者我怎样才能让它们表现得像继承的非静态方法重载?
谢谢。
你没有做错任何事。你的问题看起来像 stack overflow: inheritance and method overloading
的重复除非您 using XXXX
做类似的事情。
class Base {
public:
static void method(std::string someParam);
}
class Derived : public Base {
public:
using Base::method;
static void method(int param);
}
重点是使用 using
关键字使基础 class 的函数可见。