【问题标题】:c++ static methods and inheritance in templates with overloadingc++ 静态方法和模板中的继承与重载
【发布时间】:2016-01-16 08:26:34
【问题描述】:

这是我在这里的第一篇文章,我已经寻找了几天的答案,所以我问了。 这是一个复杂的结构。我在 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
};

我将所有这些都封装在类中,以便让 SpiderMonkey 管理 javascript 对象。我在代码的某处有以下工作调用(有点简化,清理了测试和验证):

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 = signed short)。

如果派生类中的方法不存在,则无论第二个参数的类型如何,都会调用父类中的方法。

我希望能够根据其参数寻找合适的方法。 这将使我在这两种方法的每个派生类中都有一个副本(如有必要,或者至少是默认方法的副本)。

我做错了什么,或者我怎样才能让它们表现得像在继承的非静态方法重载中一样?

谢谢。

【问题讨论】:

  • 阅读一些关于 C++ 中虚函数和函数覆盖的理论,然后提问。
  • 对不起,我被绑定到静态,虚拟不适用,AFAIK...

标签: c++ templates inheritance static overloading


【解决方案1】:

做这样的事情。

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

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

重点是使用using 关键字使基类的函数可见。

【讨论】:

    【解决方案2】:

    你没有做错任何事。您的问题看起来与stack overflow: inheritance and method overloading 重复

    重载的方法会丢失,除非你 using XXXX

    【讨论】:

    • 嗯,我已经看到了,但是没有静态方法,所以我推测它可能会有所不同。
    • 我对 C++ 有点生疏,我从来没有使用过using。您能否指出我如何在这里实现它?谢谢。
    猜你喜欢
    • 2011-12-27
    • 2015-03-20
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多