Это мой первый пост здесь, я искал ответ в течение нескольких дней, поэтому я прошу. Это сложная конструкция. Я вставляю Javascript движок SpiderMonkey в плагин Illustrator. Illustrator имеет сложный, а иногда и непоследовательный API. В этом случае я должен вызвать метод, имеющий короткий тип в качестве параметра:C++ статические методы и наследование в шаблонах с перегрузкой
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. У меня есть следующий рабочий вызов где-то в коде (немного упрощенным, очищенную из испытаний проверки):
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.
У меня есть шаблон базового класса:
template<typename T> class jsBaseDataClass : public jsBaseClass
{
public:
...
template <typename jsT> static bool FromAIObject(JSContext *cx, T* aiObj, JSObject*& obj)
{
...
return true;
}
}
и производный класс:
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);
он попытается вызвать метод в производном классе (с параметром типа ai :: int16 = short short).
Если метод в производном классе не существует, он будет вызывать метод из родительского класса, независимо от типа второго параметра.
Я хочу, чтобы иметь возможность искать подходящий метод на основе его параметров. Это заставит меня иметь копию в каждом производном классе обоих методов (при необходимости или, по крайней мере, копию по умолчанию).
Что я делаю неправильно или как я могу заставить их вести себя как при нестационарной перегрузке метода с наследованием?
спасибо.
Прочитайте некоторую теорию о том, что виртуальные функции и функции переопределены в C++, а затем спросите. –
Извините, я привязан к статике, где виртуальные приложения не подходят, AFAIK ... – mike
Извините, не видел –