[心得] Generic Programming(GP)
Generic Programming (簡稱GP)
───────────────────────────────────────
寫程式的時候,其實很容易遇到一直在寫類似的程式碼的情況,尤其是函式的實作幾乎
一模一樣,只是參數不同而已。為了解決這種問題,我們需要盡量讓演算法和參數分離,
想辦法重複利用演算法,基於一個範本(Template)上將參數多型(Parameter Polymorphism
),就稱為 GP。(最有名的就是 C++ 的STL[1])
JJLI 在上C語言有舉過一個例子:
#define max(a, b) ((a)>(b) ? (a) : (b))
這是用巨集(Marco)來實現演算法重用,可惜,這樣的做法不能保證型別的安全,而 C++ 的
範本(Template)則可以有效的兼顧型別安全。
-- C++ Template版本 --
template<typename T> T max(T a, T b)
{
return (a>b) ? a : b;
}
至於呼叫方式,只要給它型別就好:
int a(3), b(4);
max<int>(a, b);
[1] Standard Template Library
※ --------- 這樣就是 Generic Programming 的概念,是不是超簡單 XD? ----------
接著複雜一點,你覺得函數也可以像這樣 generic 嗎?
答案是 OK!因為函數指標也可以當作資料型別 ^_^
用 STL 來舉個例子:
template<class Iterator, class Act, class Verify)
void func(Iterator begin, Iterator end, Act a, Verify v)
{
for(; begin != end; begin++)
{
if(v(*begin))
a(*begin);
}
}
-- 上面的 Template 可以用於判斷某個情況做出反應 --
例如:判斷一個人是否虛情假意
bool isFake(string name)
{
return (name == "yuan") || (name == "COB")
}
void printFake(string name)
{
printf("%s is 虛情假意 boy", name);
}
int main(int argc, char** argv)
{
func(istream_iterator<string>(cin), istream_iterator<string>(),
printFake, isFake);
return 0;
}
程式執行後,你可以打入字串,如果是 yuan or COB,就會顯示囉!
(程式沒有測試,有缺啥請自己補 XD)
當然,你可以傳入不同的函式,就可以有不同的結果,是不是很有趣 ^_^
────────────────────────────────────────
複習一下C++,如果有錯,請提醒我 ^^
ps.用 BBS 打程式碼有點麻煩,本來想打一系列,好像已經開始厭倦了...
--
推
02/11 00:59, , 1F
02/11 00:59, 1F
修正囉, thanks, 沒看過這 ID,是學弟嗎?
※ 編輯: lindo0130 來自: 140.96.76.40 (02/22 11:12)