模板元程式設計在立體幾何中的妙用
為了更好地理解三維遊戲程式設計,我開始研究了立體幾何,注意,是立體解析幾何,裡面涉及到了很多元組、向量和矩陣的知識。雖然還有一些不懂,可是這喚醒了我在高等數學中學到的知識,我想以後還是有很大的用處的。
當然,數學是工具,是為我們程式設計服務的。但是出於對效能和簡潔性的敏感,在構建數學庫的過程中我千方百計減少我們的**量。在我所學的封裝、繼承和多型以及模板中進行選擇,最後我嘗試了一下模板。
我學習了一下模板,發現這是乙個非常好的特性。使用模板偏特化的技術,可以讓編譯器在編譯器為我們做一些事情。我們先了解一下,這是在中salomon
的一篇介紹模板元程式設計中的例子,沒錯,就是求菲波那鍥數列的和。
//主模板template
<
intn>
struct
fib;
};//
完全特化版
template
<>
struct
fib<
1>;};
// 完全特化版
template
<>
struct
fib<
0>;};
intmain()
從這裡可以看出,主模板帶的引數是乙個整型的數,而不是typename
,得益於這一點,c++
才有模板元程式設計,而其它高階語言只有泛型程式設計。
這裡我有乙個需求。在3d
遊戲程式設計中,常常需要二維、三維、四維的向量,以便各種各樣的數**算。比方說需要求出兩個向量確定平面的法向量,這一點在微軟d3d
中的d3dx9math.h
中有很多體現,此外還需要適配基本的格式,像opengl
一樣,既提供float
型的也提供double
型的。怎麼實現呢?的確,用模板很好實現:
#ifndefmath3d_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...