找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1257|回复: 5

[研讨] C++如何实现求平均值函数模板类,单独一个头文件的

[复制链接]

已领礼包: 112个

财富等级: 日进斗金

发表于 2018-4-28 10:52:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
因为VC6版本不支持将模板函数在cpp文件中实现,考虑到objectarx的多版本问题,希望单独定义一个函数模板,所有函数都在头文件中实现
假设头文件名为XDtemplate.h,有一个函数Mid,两个参数,函数功能为求两个参数的平均值
若参数类型为int,返回结果为int(若值为5+6,则返回还是5,取整了)
若参数类型为double,返回值为double,(5+6)*0.5=5.5
若参数为AcGePoint3d,返回值也是AcGePoint3d,值为两点的中点

模板模板举例:
//myHeader.h
  1. #include <iostream.h>
  2. template <class T>
  3. class A
  4. {
  5.       public:
  6.       A();
  7.       T &max(const T &,const T &) const;
  8. };
  9. template <class T> T &A<T>::max(const T &a,const T &b)
  10. {
  11.     return a<b?b:a;
  12. }


使用方法
//main.cpp

  1. #include <iostream.h>
  2. #include “myHeader.h“


  3. main()
  4. {
  5.     A<int>  *cls=new A<int>();
  6.      int  a=100;
  7.      int  b=200;
  8.      cout<<cls->max(a,b)<<endl;
  9.      return 0;
  10. }


我参照上面所写,连编译都没有成功,若想实现一个求平均值的函数模板,请问具体的头文件如何写?函数如何使用?
函数模板尽可能在一个头文件中,下图中函数模板和使用在同一个文件中,不利于函数模板的多重使用
99.png

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2018-4-28 11:09:06 | 显示全部楼层
如果要max通用,那应该实现类A的比较函数才对吧

点评

这里的类只是起一个容器的作用,目前把这个类做成包括多个函数模块的类,方便使用, 目前只看类里面的的函数模板,想实现能同时求Int double AcGePoint3d的平均值  详情 回复 发表于 2018-4-28 11:25
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2018-4-28 11:25:37 | 显示全部楼层
aeo 发表于 2018-4-28 11:09
如果要max通用,那应该实现类A的比较函数才对吧

这里的类只是起一个容器的作用,目前把这个类做成包括多个函数模块的类,方便使用,
目前只看类里面的的函数模板,想实现能同时求Int double AcGePoint3d的平均值
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2018-4-28 15:03:41 | 显示全部楼层
只有完全相同的操作才能写函数模板,自己贪心了
AcGePoint3d求中点,需要分别计算x,y,z的平均值,而int double之类则只需要计算一次,所以这样的函数模板不成立,
结贴
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3904个

财富等级: 富可敌国

发表于 2018-4-30 09:34:17 | 显示全部楼层
路过看看而已
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2023-9-4 00:10:28 | 显示全部楼层
  1. template<typename... Args>
  2. auto averageN(Args... args)
  3. {
  4.         double n = sizeof...(args);
  5.         auto val = (args + ...);
  6.         return val / n;
  7. }
复制代码


需要C++17 或者更高
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 23:44 , Processed in 0.443958 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表