泛型程序设计实例(二)

来源:互联网 发布:新晨科技 知乎 编辑:程序博客网 时间: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 编辑器,无序列表格式全丢

原创粉丝点击