模板元程式設計在立體幾何中的妙用

2021-08-27 07:39:24 字數 3636 閱讀 5462

模板元程式設計在立體幾何中的妙用

為了更好地理解三維遊戲程式設計,我開始研究了立體幾何,注意,是立體解析幾何,裡面涉及到了很多元組、向量和矩陣的知識。雖然還有一些不懂,可是這喚醒了我在高等數學中學到的知識,我想以後還是有很大的用處的。

當然,數學是工具,是為我們程式設計服務的。但是出於對效能和簡潔性的敏感,在構建數學庫的過程中我千方百計減少我們的**量。在我所學的封裝、繼承和多型以及模板中進行選擇,最後我嘗試了一下模板。

我學習了一下模板,發現這是乙個非常好的特性。使用模板偏特化的技術,可以讓編譯器在編譯器為我們做一些事情。我們先了解一下,這是在中salomon

的一篇介紹模板元程式設計中的例子,沒錯,就是求菲波那鍥數列的和。

// 

主模板template

<

intn>

struct

fib;

};//

完全特化版

template

<>

struct

fib<

1>;};

// 完全特化版

template

<>

struct

fib<

0>;};

intmain()

從這裡可以看出,主模板帶的引數是乙個整型的數,而不是typename

,得益於這一點,c++

才有模板元程式設計,而其它高階語言只有泛型程式設計。

這裡我有乙個需求。在3d

遊戲程式設計中,常常需要二維、三維、四維的向量,以便各種各樣的數**算。比方說需要求出兩個向量確定平面的法向量,這一點在微軟d3d

中的d3dx9math.h

中有很多體現,此外還需要適配基本的格式,像opengl

一樣,既提供float

型的也提供double

型的。怎麼實現呢?的確,用模板很好實現:

#ifndef

math3d_h

#define

math3d_h

// 以下**需要高階版本

c++編譯器支援

template

<

typenamet,

intn>

union

tuple

;//

特化template

<

typename

t>

union

tuple

2>

tuple(t

_1,t_2)

void

set(

t_1,t_2

)operatort*(

void

)//

過載型別轉換函式

tuple

operator

+(const

tuple

&obj

)const

// 過載減號

tuple

operator

-(const

tuple

&obj

)const

// 過載減號

tuple

&operator

+=(const

tuple

&obj

)//-------------------------------------tm

[2];struct

;struct;};

template

<

typename

t>

union

tuple

3>

tuple(t

_1,t

_2,t_3)

void

set(

t_1,

t_2,t_3

)operatort*(

void

)//

過載型別轉換函式

tuple

operator

+(const

tuple

&obj

)const

// 過載減號

tuple

operator

-(const

tuple

&obj

)const

// 過載減號

tuple

operator

*(constt&

obj)

const

// 過載減號

tuple

operator

-(void

)tuple

&operator

+=(const

tuple

&obj

)//-------------------------------------tm

[3];struct

;struct;};

template

<

typename

t>

union

tuple

4>

tuple(t

_1,t

_2,t

_3,t_4)

void

set(

t_1,

t_2,

t_3,t_4

)operatort*(

void

)//

過載型別轉換函式

tuple

operator

+(const

tuple

&obj

)const

// 過載減號

tuple

operator

-(const

tuple

&obj

)const

// 過載減號

tuple

&operator

+=(const

tuple

&obj

)//-------------------------------------tm

[4];struct

;struct;};

// 定義資料型別

typedef

tuple

<

float,2

>

vector2f

,point2f

,size2f

;typedef

tuple

<

float,3

>

vector3f

,color3f

,point3f

;typedef

tuple

<

float,4

>

vector4f

,color4f

;

這裡用tuple

表示乙個通用的類模板,第乙個引數表示型別,如float

、double

等,第二個引數表示成員的個數。我們通過特化2

、3、4

個成員個數的類模板來分別定義這些行為。最後定義了vector2f

等一些常見的型別。你們看,是不是比較好地達到了要求?

此外,這裡使用到了union

聯合體的相關用法,在下一次我將向大家介紹union

的妙用。

(C 模板程式設計) 多型在模板中的應用

多型 人類 class human virtual human 作為父類時一般應該有乙個虛析構函式,在 c 設計模式 中給大家講解 男人 class men public human 女人 class women public human men objmen women objwomen 父類引用...

C 模板程式設計與泛型程式設計之類模板中的友元(二)

template void func u val1,v val2 func 2,3 func 4.6f,5 第乙個模板引數指定,第二個模板引數編譯器自己推斷 func 4,5.8f 完全手工指定模板引數val1 2 val2 3 val1 4.6 val2 5 val1 4 val2 5.8clas...

關於函式模板在類模板中宣告為友元的一些心得

用類模板設計時,有時需要在類定義中宣告友元函式,比如過載輸出操作符 而當友元函式是模板函式時,則需要滿足一些宣告和定義的規則。如,當我編寫乙個順序錶類模板時,加入了過載 的友元模板如下 template class seqlist 此時在main.cpp檔案中定義operator 如下 templa...