2010-05-07 79 views
6

我已經用C++編寫了一些物理模擬代碼,解析輸入文本文件是其瓶頸。作爲輸入參數之一,用戶必須指定一個數學函數,該函數在運行時將被多次評估。 C++代碼爲此提供了一些預定義的函數類(它們在數學方面實際上相當複雜)以及一些有限的解析能力,但我並不滿意這種構造。通過Python將C++對象傳遞給C++代碼?

我需要的是算法和函數評估都保持快速,所以將它們都保存爲編譯代碼(最好是數學函數作爲C++函數對象)是有利的。然而,我想將整個模擬與Python結合在一起:用戶可以在Python腳本中指定輸入參數,同時還可以在Python中實現存儲,結果(matplotlib)和GUI的可視化。我知道大部分時間,可以完成暴露C++類的工作,例如,與SWIG,但我仍然有一個關於在Python中解析用戶定義的數學函數的問題:

是否有可能以某種方式在Python中構造一個C++函數對象並將其傳遞給C++算法? E.g.當我在Python調用

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

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

的一點是,沒有回調應在算法進行到Python代碼。後來我想擴展這個例子,在Python一邊做一些簡單的表達式解析,例如函數的sum或product,然後返回一些像C++對象那樣的複合,解析樹,但是讓我們暫時保留基本的東西。

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

回答

3

我一直在做類似這樣的事情。最簡單的解決方案,以及我通常選擇的解決方案,因爲如果沒有別的,我很懶惰,就是將API扁平化爲一個類似C的API,然後只傳遞指向和來自Python(或您選擇的其他語言)的指針。

首先創建類

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

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

然後創建功能的C風格的API,創建和銷燬這些類。無論如何,因爲我使用的語言不會保持類型安全,所以我通常會放棄傳遞void *。這樣就更簡單了。只要確保投回到正確的類型,然後實際使用無效*

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; 
    } 

無所有你需要做的是讓蟒蛇呼叫的那些C風格的功能。事實上,他們可以(也可能應該)使用外部「c」功能來使鏈接更容易。