簡體   English   中英

通過Python將C ++對象傳遞給C ++代碼?

[英]Passing C++ object to C++ code through Python?

我用C ++編寫了一些物理仿真代碼,解析輸入文本文件是它的一個瓶頸。 作為輸入參數之一,用戶必須指定一個數學函數,該函數將在運行時多次評估。 C ++代碼有一些預先定義的函數類(它們在數學方面實際上非常復雜)和一些有限的解析能力但我對這種結構完全不滿意。

我需要的是算法和函數評估都保持快速,因此將它們保存為編譯代碼(最好是數學函數作為C ++函數對象)是有利的。 然而,我想到將整個模擬與Python粘合在一起:用戶可以在Python腳本中指定輸入參數,同時在Python中實現存儲,結果可視化(matplotlib)和GUI。

我知道大多數時候,暴露C ++類可以完成,例如使用SWIG,但我仍然有一個關於在Python中解析用戶定義的數學函數的問題:

有可能以某種方式在Python中構造一個C ++函數對象並將其傳遞給C ++算法嗎? 比如我打電話的時候

f = WrappedCPPGaussianFunctionClass(sigma=0.5)
WrappedCPPAlgorithm(f)

在Python中,它會返回一個指向C ++對象的指針,然后將其傳遞給需要這樣一個指針的C ++例程,或類似的東西......(在這種情況下,不要問我有關內存管理的問題,但是:S)

關鍵是應該在算法中對Python代碼進行回調 后來我想擴展這個例子,也可以在Python端進行一些簡單的表達式解析,比如求和或函數的乘積,然后返回一些復合,像C ++對象一樣的解析樹,但現在讓我們保持基礎。

對不起,長期發布的帖子和thx的建議提前。

我總是這樣做。 最簡單的解決方案,也是我經常選擇的解決方案,因為,如果沒有別的,我很懶,就是將你的API壓縮成類似C的API,然后只是傳遞指向Python(或你選擇的其他語言)的指針。

首先創建你的類

class MyFunctionClass
{
  public:
    MyFunctionClass(int Param)
    ...
};

class MyAlgorithmClass
{
  public:
    MyAlgorithmClass(myfunctionclass& Func)
    ...
};

然后創建一個C風格的函數api,用於創建和銷毀這些類。 因為我使用的語言無論如何都不保持類型安全,所以我通常在外面通過無效*傳播。 這樣更簡單。 只需確保在實際使用空格之前回到正確的類型*

    void* CreateFunction(int Param)
    {
      return new MyFunctionClass(Param);
    }

    void DeleteFunction(void* pFunc)
    {
        if (pFunc)
            delete (MyFunctionClass*)pFunc;
    }

    void* CreateAlgorithm(void* pFunc)
    {
      return new MyAlgorithmClass(*(MyFunctionClass*)pFunc)
    }

    void DelteAlgorithm(void* pAlg)
    {
       if (pAlg)
           delete (MyAlgorithmClass*)pAlg;
    }

沒有你需要做的就是讓python調用那些C風格的函數。 實際上,它們可以(也可能應該)是外部“c”函數,以使鏈接更容易。

暫無
暫無

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

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