2016-01-16 3 views
2

Это мой первый пост здесь, я искал ответ в течение нескольких дней, поэтому я прошу. Это сложная конструкция. Я вставляю 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).

Если метод в производном классе не существует, он будет вызывать метод из родительского класса, независимо от типа второго параметра.

Я хочу, чтобы иметь возможность искать подходящий метод на основе его параметров. Это заставит меня иметь копию в каждом производном классе обоих методов (при необходимости или, по крайней мере, копию по умолчанию).

Что я делаю неправильно или как я могу заставить их вести себя как при нестационарной перегрузке метода с наследованием?

спасибо.

+0

Прочитайте некоторую теорию о том, что виртуальные функции и функции переопределены в C++, а затем спросите. –

+0

Извините, я привязан к статике, где виртуальные приложения не подходят, AFAIK ... – mike

+0

Извините, не видел –

ответ

0

Делайте что-то подобное.

class Base { 
public: 
    static void method(std::string someParam); 
} 

class Derived : public Base { 
public: 
    using Base::method; 
    static void method(int param); 
} 

Дело использует using ключевое слово для создания функции базового класса видимой.

+0

Спасибо вам обоим. – mike

0

Вы ничего не делаете неправильно. Ваш вопрос выглядит как дубликат stack overflow: inheritance and method overloading

перегруженных методов запутаться, если вы using XXXX

+0

Ну, я видел это, но не было статических методов, поэтому я предположил, что это может быть чем-то другим. – mike

+0

Я немного ржавый на C++, я никогда не использовал 'using'. Не могли бы вы указать мне, как я мог бы реализовать его здесь? Благодарю. – mike