泛型程序设计实例(二)
来源:互联网 发布:新晨科技 知乎 编辑:程序博客网 时间:2024/06/06 00:24
- 问题提出
- 直接思维
- 泛型思维
问题提出
设计一个函数,从一个容器中找到某一个变量,有时候我希望它返回的是这个变量的下标,有时候我希望它返回的是是否找到这个变量(我知道我很贱)
直接思维
两个函数,一个返回是否找到,一个返回找到的下标,如果没有找到就返回-1
bool MatrixFind(int number, const Matrix& matrix) { auto it = std::find(matrix.m_numbers.begin(), matrix.m_numbers.end(), number); if(it == matrix.m_numbers.end()) { return false; } return true;}unsigned int MatrixFindIndex(int number, const Matrix& matrix) { auto it = std::find(matrix.m_numbers.begin(), matrix.m_numbers.end(), number); if(it == matrix.m_numbers.end()) { return 0; } return it - matrix.m_numbers.begin();}
泛型思维
观察代码,发现程序中有重复的语义:
// 使用 find 查找,得到迭代器// 根据迭代器的值返回相应的值
我们在代码层面上想做到这样子:
返回值类型根据某个判断来决定,最好就在编译期就决定了
于是写成了如下样子:
template <typename T>friend T MatrixFindSth(int number, const Matrix& matrix) { auto it = std::find(matrix.m_numbers.begin(), matrix.m_numbers.end(), number); if(it == matrix.m_numbers.end()) { if(typeid(T) == typeid(int)) { return -1; } return false; } if(typeid(T) == typeid(int)) { std::cout << "Here" << (it - matrix.m_numbers.begin()) << std::endl; return (it - matrix.m_numbers.begin()); } return true;}
然后在调用的时候是这个样子:
std::cout << MatrixFindSth<int>(1,matrix) << std::endl; // 想要下标std::cout << MatrixFindSth<bool>(1,matrix) << std::endl; // 想知道是否找到
恩,理想很丰满,但是,现实很骨感!
以上模板定义没有错,调用代码出错: Error clang use of undeclared identifier 'MatrixFindSth'; did you mean 'MatrixFind'?
Error clang expected '(' for function-style cast or type construction
Error clang reference to overloaded function could not be resolved; did you mean to call it?
于是……
template <typename T>T func(int number, Matrix& matrix) { auto it = std::find(matrix.getNumbers().begin(), matrix.getNumbers().end(), number); if(it == matrix.getNumbers().end()) { if(typeid(T) == typeid(int)) { return -1; } return false; } if(typeid(T) == typeid(int)) { return (it - matrix.getNumbers().begin()); } return true;}
然后……
std::cout << func<int>(1,matrix1) << std::endl;std::cout << func<bool>(1,matrix1) << std::endl;
这样子居然没有问题,Are you kidding me !?
友元函数有毒吗?
CSDN 辣鸡 MD 编辑器,无序列表格式全丢
阅读全文
1 0
- 泛型程序设计实例(二)
- CPU卡程序设计实例(二)软件设计
- 泛型程序设计实例(一)
- java - 泛型程序设计(二)
- CPU卡程序设计实例(二十四)生成过程密钥
- 杨季文 80x86汇编语言程序设计 实例二
- 程序设计模式(二)创建型模式
- 汇编语言程序设计(二)
- Windows程序设计(二)
- 数组程序设计(二)
- 指针程序设计(二)
- shell程序设计(二)
- 程序结构&&程序设计(二)
- Python程序设计(二)
- windows程序设计(二)
- unix网络编程各种TCP客户-服务器程序设计实例(二)
- unix网络编程各种TCP客户-服务器程序设计实例(二)
- CPU卡程序设计实例(二十)8字节随机数读取
- 纯CSS实现垂直居中的几种方法
- 思想决定你走什么样的路
- 动态规划实例(五):0-1背包问题(整包背包)
- Hyper-v虚拟机配置内部虚拟交换机
- 统计自然语言处理(词汇获取)
- 泛型程序设计实例(二)
- pointInside 和 hitTest (超出父视图点击事件不响应解决办法)
- SDUT-2553 完美的素数
- 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】
- 一个经典例子让你彻彻底底理解java回调机制
- 桶排序与基数排序、计数排序
- mybatis知识点总结和梳理
- bootstrap table表格里的某一行置顶
- 包图