2010-02-03 51 views
1

讓我從一個具體的例子開始。在C++中,我在抽象基類CollisionVolume下有一個類的層次結構。任何碰撞體積都需要能夠與其他任何體積的detectCollision。這個碰撞代碼是基於存在的兩個子類而專門設計的,但它是可交換的:detectCollision(a, b) == detectCollision(b, a)帶兩個操作數的虛擬函數可以採用多種不同的類型

我需要使用類似於虛擬函數的機制,因爲對象通常是抽象基類。但是,如果我使用典型的虛擬方法,所選函數只能取決於其中一個操作數的類型,而不能同時取決於兩者。我能做到這一點的唯一方法是使用RTTI或類似RTTI的機制。

有沒有清潔的方式做到這一點?

+0

您可以在C++ 11中使用多派遣:http://ideone.com/lTsc7M – Jarod42 2014-02-04 16:41:21

回答

2

您正在尋找multiple dispatch。 C++沒有它,因爲它很難有效地實現。大多數其他靜態類型/效率導向的語言也不會。你的RTTI解決方案可能是僞造它的最好方法。

+0

「多派遣」的維基百科頁面甚至在示例部分中使用了衝突 - 太有趣了。 (我不是一個遊戲程序員,也許這就是它的用法的典型例子......) – Dan 2010-02-04 05:43:11

+0

奇怪。幾天前我偶然發現了一個多次調度的鏈接,但沒有遵循它。非常感謝! – 2010-02-04 17:29:02

1

有幾種解決方案來模擬C++中的multimethods。

這裏提供一些參考,可以幫助你解決你的問題:

S.Meyers「More effective C++」,第31條:讓虛擬功能相對於多個對象。

A.Alexandrescu 「Modern C++ design」,第11章多方法

MultiMethods in C++: Finding a complete solution通過DANIL Shopyrin

Multiple Dispatch. A new approach using templates and RTTI由Carlo Pescio博士,C++報告,1998年6月

建議草案添加多方法來C++,herehere

+0

偉大的鏈接!謝謝! – 2010-02-04 17:34:45

0

我最初的想法,在閱讀後似乎是visitor pattern(?),是創建一個虛擬函數,返回有關該對象的一些重要信息,然後在detectCollision()中比較兩個對象返回的重要信息。這樣,每個對象都可以返回專門的信息,但它們可以通用的方式進行比較。

這可能不是最有效的方式,但它看起來相對簡單。

+0

我想過訪問者模式,但它不工作。 根據存在的兩個卷,碰撞檢測代碼可以非常專業化。因此,「重要信息」將用於在不同的執行路徑之間進行分支。這大致就是我使用類似RTTI的解決方案所做的:根據它查詢類型和分支。 – 2010-02-04 17:34:22

相關問題