作者hylkevin (Kevin)
看板C_and_CPP
标题Re: [问题] 有办法用大於小於来启动function嘛
时间Thu Feb 26 23:13:51 2009
※ 引述《littleshan (我要加入剑道社!)》之铭言:
: 另一个方法是用 template
: template <class CMP> void f(int a, int b)
: {
: CMP cmp;
: cout << "comparing " << a << " and " << b << ": ";
: if( cmp(a, b) )
: cout << "true" << endl;
: else
: cout << "false" << endl;
: }
: 用的时候是像这样
: f< less<int> >(10, 20); // 呼叫小於的版本
: f< less<int> >(20, 10); // if( cmp(a, b) ) 的作用相当於 if( a < b )
: f< greater<int> >(10, 20); // 同上,改成大於的版本
: f< greater<int> >(20, 10); // if( cmp(a, b) ) 相当於 if( a > b )
: 可以改用 template template parameter 让你呼叫时少打一些字
: template <class T, template<class> class CMP> void f(T a, T b)
: {
: CMP<T> cmp;
: cout << "comparing " << a << " and " << b << ": ";
: if( cmp(a, b) )
: cout << "true" << endl;
: else
: cout << "false" << endl;
: }
: int main()
: {
: ...
: f<less>( 10, 20 );
: f<greater>( 10, 20 );
: }
用了funtion pointer或function object了
function的部分合必用template呢?
这这样会有个缺点
若是比较函数以外的部分过多
会造成冗余重复的程式码
因每个不同TYPE的template皆会在执行档中产生相对的程式码
若用
void f(type a, type b,fptr_type comp)
{
// do many things
if(comp(a,b))
{
// do many things
}
// do many things
return;
}
如此就不会你传N种比较函数
就产生N份99.99%相同的程式码
而且也不限定C++才能使用
若使用C++
建议使用function object
因为可以用inline的方式做掉
减少呼叫function的额外负担
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.184.228
1F:推 Cloud:的确,用STL的algorithm也建议使用function object 02/27 00:13
2F:→ Cloud:因为他们实做functon object 用inline 02/27 00:13
3F:推 littleshan:我提的方法就是用 function object 02/27 00:33
4F:→ littleshan:用 function pointer (或动态多型) 比较慢 02/27 00:34
5F:→ littleshan:用 template (或 function object) 快,可是肥,就降。 02/27 00:35