您的位置:首页 > 房产 > 家装 > 淄博做网络推广的公司_电商平台企业的市场类型_搜索引擎营销案例分析题_搜索引擎分析论文

淄博做网络推广的公司_电商平台企业的市场类型_搜索引擎营销案例分析题_搜索引擎分析论文

2025/1/6 12:33:06 来源:https://blog.csdn.net/mynightgirl/article/details/144385716  浏览:    关键词:淄博做网络推广的公司_电商平台企业的市场类型_搜索引擎营销案例分析题_搜索引擎分析论文
淄博做网络推广的公司_电商平台企业的市场类型_搜索引擎营销案例分析题_搜索引擎分析论文

c++模板函数 template

1.[模板函数]

下面代码是一个简单的模板函数,对比a和b的大小。

#include <iostream>
using namespace std;template <typename T>
T bigger(T a, T b)
{return a > b ? a : b;
};
int main(){cout << bigger(5,7)<<endl; cout << bigger<float>(5.3,7)<<endl;cout << bigger('\0','A')<<endl;return 0;
}

2.[显式具体化]和[模板函数重载]

如果现在想对box结构进行比较,所以直接用show_box(bigger(a,b))是不行的,box结构没有定义>的逻辑。我想按box的体积也就是box.volume来比较大小。这时候怎么办呢?
第一个是重写bigger方法。如代码所示,这样完全ok性能也算是最优的一种。编译的时候也会比较快。
但是我想要模板函数的显示具体化怎么做呢?我这里卡了好久。

最简单的一个方法。

如代码的显示特化 01所示,完全可以运行,结果也没问题。
但这里问题是如果box是相对复杂的对象,直接通过值的方式调用box a,会把a的内容全部再在内存复制一份,在内存和cpu上不是最优的,能不能像 重写的bigger方法一样使用引用呢?
比如//显示特化 02,这时无法通过编译,因为这时的显式具体化没有对应的模板函数,
他没法直接从template <typename T> T bigger(T a, T b)(1)中来具体化,
而是需要从template <typename T> T &bigger(T &a, T &b)(2)中来具体化。
现在代码中添加模板函数的重载,先有一个template <typename T> T &bigger(T &a, T &b)
此时再编译还是不通过,说call of overloaded 'bigger<box>(box&, box&)' is ambiguous.也就是说(1)和(2)这俩模板都能对应到显示特化 template <>box bigger(box a, box b)上,编译后都会生成实例,然后有可用的同名的函数,导致冲突,无法编译通过。
怎么整,引用和指针都可以不把对象按值传参到函数内部,换成指针参数试试?
这时template <typename T> T *bigger(T *a, T *b) (3)来了,又是跟(2)一样,需要先重载模板函数,要求输入输出都是指针。
再显示具体化template <>box *bigger(box *a, box *b);
调用的时候也需要调整为show_box(*bigger(&a,&b));
终于这个方案可行,编译通过,结果正确。

#include <iostream>
using namespace std;template <typename T>
T bigger(T a, T b)
{return a > b ? a : b;
};
// 引用传参数和值传参数,同时出现会有问题,无法正常编译会有问题
template <typename T>
T &bigger(T &a, T &b)
{return a > b ? a : b;
};template <typename T>
T *bigger(T *a, T *b)
{return *a > *b ? a : b;
};
struct box{char maker[40];float height;float width;float length;float volume;
};
void set_box(box &a){a.volume=a.height*a.width*a.length
}
void show_box(const box &a){cout << a.maker<<", volume="<<a.volume<<", h*w*l="<<a.height<<"*"<<a.width<<"*"<<a.length<<endl;
}
//重写bigger方法
box & bigger(const box &a,const box &b){return (a.volume > b.volume) ? a : b;
}
//显示特化 01
template <>
box bigger(box  a, box  b)
{return (a.volume > b.volume) ? a : b;
};//显示特化 02 无法正常编译会有问题
template <>
box &bigger(box  &a, box  &b)
{return (a.volume > b.volume) ? a : b;
};
//显示特化 03
template <>
box *bigger(box *a, box *b){return ((*a).volume > (*b).volume) ? a : b;
}int main(){cout << bigger(5,7)<<endl; cout << bigger<float>(5.3,7)<<endl;cout << bigger('\0','A')<<endl;box a = {"kk",3,5,8};box b = {"tt",4,5,7};set_box(a);set_box(b);show_box(bigger(a,b));show_box(*bigger(&a,&b)); return 0;
}

总结

可行的方案:

  1. 重写bigger 为普通函数,可行,性能也ok
  2. 模板函数显式特化,可行,直接用template <typename T> T bigger(T a, T b)的特化性能会有下降。
  3. 接用template <typename T> T* bigger(T *a, T *b)的特化,可行,切性能也ok
    问题:
  4. 使用 template <typename T> T bigger(T a, T b)template <typename T> T &bigger(T &a, T &b),最好别同时出现。模板函数显式特化需要和其对应的模板函数匹配。

模板函数有些场景下可能并不好用,需要有选择的使用。

参考

  1. 函数模板 function template

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com