2010-06-01 79 views
2

在C++中如何告訴編譯器Ogre :: Vector3 IS_SAME_AS SomeOtherLIB :: Vector3? 我覺得..在像C++這樣的語言中,這些語言不是結構化類型,但有些情況下它是有意義的。C++或任何其他語言的可選結構打字可能性?

通常作爲遊戲開發人員使用4 +庫提供排序或自己的Vector3實現。代碼充斥着ToOgre,ToThis,ToThat轉換功能。這是很多Float3的複製,不應該在第一個地方發生。

使用C++或其他語言,我們不必從一種類型轉換(複製)到另一種基本上相同的語言。但是C++中的任何解決方案都是用於c/C++的。

+2

我錯過了什麼嗎?爲什麼用OCaml標記? – 2010-06-02 21:07:11

+0

[ocaml]標記已刪除 – Thelema 2010-06-09 23:01:20

回答

17

如果使用模板,只要在該類型上定義了必要的操作,就可以定義採用任何類型參數的函數。例如:

class Foo { void quack() {} }; 
class Bar { void quack() {} }; 
class Baz {}; 

template<typename Duck> 
void f(Duck d) { 
    d.quack(); 
} 
int main() { 
    f(Foo()); // works 
    f(Bar()); // works 
    f(Baz()); // compile error because Baz does not have a quack method 
    return 0; 
} 
+4

+1用於僞代碼ducktyping示例 – Earlz 2010-06-01 22:20:30

2

如果你確實確信在非虛擬結構的情況下,你可以做一個reinterpret_cast。然而,最好是:

  1. 做模板封裝函數從矢量中的一個示出由sepp2k
  2. 繼承和轉換運算符添加到其它載體
  3. 添加單獨_cast函數執行轉換
5

雖然它不適合任何情況,模板可以給你「編譯時鴨子打字」

比方說你有兩個載體類型:

struct Vec3A { 
    float x, y, z; 
}; 

struct Vec3B { 
    float p[3]; 
}; 

您可以定義隱藏實現的如何獲得組件函數模板:

template<class T> float get_x(const T&); 
template<class T> float get_y(const T&); 
template<class T> float get_z(const T&); 

template<> float get_x<Vec3A>(const Vec3A& v) { return v.x; } 
// ... 
template<> float get_x<Vec3B>(const Vec3B& v) { return v.p[0]; } 
// ... 

有了這樣的助手,你現在就可以編寫通用可以在兩者上工作的功能:

template<class T> float length(const T& t) { 
    return std::sqrt(std::pow(get_x(t), 2), 
        std::pow(get_y(t), 2), 
        std::pow(get_z(t), 2)); 
} 

您還可以繼續e出於性能或其他原因通過專門使用諸如length()等實用程序,例如如果某一矢量已經有一個成員函數爲您提供長度:

template<> float length<Vec3C>(const Vec3C& v) { 
    return v.length(); 
} 
+0

「編譯時鴨子打字」被稱爲「結構打字」,如果我沒有弄錯的話。 – weberc2 2013-10-07 15:14:07

0

Haxe是高度可移植的語言與完全可選的結構的子類型:

typedef Vector3 = { x : double, y : double, z : double }; 

class FancyVector3 { 
    public var x : double, y : double, z : double; 

    function dot(Vector3 v) { 
     return x * v.x + y * v.y + z * v.z; 
    } 

    function length() { 
     return Math.sqrt(dot(this)); 
    } 
} 

不僅是的Vector3一個已經可用的結構,它也作爲其他類的結構接口。這樣的結構可以指定函數簽名以及字段。

Haxe也有CFFI與C++交談(儘管它仍然需要轉換方法),並且綁定已經存在幾個C++遊戲引擎以及各種底層框架。以純Haxe編寫的跨平臺引擎也在開發中,針對各種C++,Flash和JS(Canvas和WebGL)。

這可能不是您正在尋找的解決方案,但可能會在幾年內變得更有趣。

相關問題