2013-06-24 50 views
0

我想用Python的方式在C++ 11元組中實現一個簡單的樹。在Python中,我們可以使用type(obj)來檢查運行時對象類型,並將具有不同類型的對象傳遞給一個函數,我已經爲calc()編寫了僞代碼,如何在C++中執行它?我嘗試打印typeid(child1).name()和typeid(tree).name(),他們是'St5tupleIIciiEE'和'St5tupleIIcS_IIciiEES0_EE'。C++中的樹11 RTTI的元組

我的環境是g ++ 4.8.1。謝謝!

// pseudo code 
int calc(tuple tree) { 
    symbol = type(get<0>(tree)); 
    l_child = type(get<1>(tree)); 
    r_child = type(get<2>(tree)); 

    l = (type(l_child) == tuple) ? calc(l_child) : l_child; 
    r = (type(r_child) == tuple) ? calc(r_child) : r_child; 

    return l symbol r; 
} 

int main() 
{ 
    auto l_child = make_tuple('*', 1, 2); 
    auto r_child = make_tuple('-', 5, 1); 
    auto tree = make_tuple('+', l_child, r_child); 

    cout << calc(tree) << endl; 

} 

回答

1

這是不真實的,因爲typeid().name的結果是實現定義的。

const char* name() const noexcept; 

返回:實現定義的非關稅壁壘。

然而,在這裏,你不能使用三元運算符,因爲calc(l_child)將在編譯時進行評估,因此,如果l_child不是元組,編譯將會失敗。

您可以使用某些類型特徵(或重載),因爲tuple成員在編譯時已知。

int calc(int value) 
{ 
    return value; 
} 

template<typename Left, typename Right> 
int calc(const std::tuple<char, Left, Right>& tuple) 
{ 
    char symbol = std::get<0>(tuple); 
    Left l_child = std::get<1>(tuple); 
    Right r_child = std::get<2>(tuple); 
    int l = calc(l_child); 
    int r = calc(r_child); 
    return l /*symbol*/, r; 
} 

Live example

2

Python和C++有很大的不同的語言。 C++是靜態類型的,Python不是。將Python技術移植到C++可能會也可能不會。在這種情況下,它不會工作。

在Python中,只有一個元組類,能夠表示任何元組;在C++中,有無數的元組類型,每個元組都能夠保存特定類型的數據。它們不可互換,因爲你的實驗恰恰證明了typeid

在C++中,不能在元組中保存任意樹。編寫一個樹類(或更好的,一個類模板)。

編輯:從技術上講,如果您將元組與指針和聯合結合使用,則可以使用元組。但是不建議這樣做。你的樹將成爲你的中心抽象,暴露出如此低層次的細節,因爲指針和聯合會起反作用,應該避免。 C++的方法是寫一個類,堅持下去。