簡體   English   中英

Python C ++ API-在函數重載中返回不同類型

[英]Python C++ api - return different types in function overloading

我有一個C ++類,其中包含兩個重載的方法sayHi() ,每個方法具有不同的返回類型:

class Box {
   public:

      Box();

      void sayHi(char *name);

      int sayHi(int number);

};

當我嘗試包裝此函數時,我遵循了ShadowRanger的建議,並“編寫了一個包裝函數,該包裝函數對提供的參數進行類型檢查並將其分派到正確的'real'函數”

這里是:

static PyObject *pyBox_sayHi_char(PyBox *self, char *Name)
{
    self->bx->sayHi(Name);

    Py_RETURN_NONE;
}

static int *pyBox_sayHi_int(PyBox *self,  int number)
{
    int answer;

    answer = self->bx->sayHi(number);

    return answer;
}

static PyObject *Hi_overload_switch(PyBox *self,  PyObject *args)
{
    PyObject *x;

    if (!PyArg_ParseTuple(args, "O", &x))
        return NULL;

    if (PyUnicode_Check(x))
    {
        const char* s = PyBytes_AsString(PyUnicode_AsUTF8String(x)); // convert PyObject to char*

        Py_DECREF(x);

        return pyBox_sayHi_char(self, s);
    }
    if (PyLong_Check(x))
    {   
        return pyBox_sayHi_int( self, PyLong_AsLong(x) );
    }
    Py_RETURN_NOTIMPLEMENTED;
}

和以下方法表:

static PyMethodDef pyBox_methods[] = {
    {"Hi", (PyCFunction)Hi_overload_switch, METH_VARARGS, "Hi"},
    {NULL, NULL, 0, NULL}
};

但是,我得到了錯誤:

error: cannot convert ‘int*’ to ‘PyObject*’ {aka ‘_object*’} in return
         return pyBox_sayHi_int( self, PyLong_AsLong(x) );

AFAIK,我不想將返回類型轉換為PyObjects,因為重載的方法可能需要返回自定義類型。 因此,在我的示例中, int vs void僅出於說明目的-我很可能已經編寫了PyBanana vs PyOrange數據類型。

我的問題是,如何使函數Hi_overload_switch返回不同的類型?

謝謝!

您需要返回一個Python int 在C / C ++源代碼中,這是一個PyLongObject (這是PyObject的子類型,因此您可以將PyLongObject*轉換為PyObject*並返回)。 要將C ++ int轉換為PyObject* Python int ,請使用PyObject* PyLong_FromLong(long)

static PyObject *pyBox_sayHi_int(PyBox *self,  int number)
{
    int answer;

    answer = self->bx->sayHi(number);

    return PyLong_FromLong(answer);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM