C++模板匹配优先问题

Cpp初学者 2019-04-18 11:07:11
如图:

我觉得这个设计不太合理,
const形参一层意义是函数表明自己不会通过指针修改,可是这里设计者似乎认为非const指针转换为const会有一定的代价,导致上面的匹配,指针版劣于非指针版。


我希望所有的指针,都匹配到输出指针的那个实例,其他的匹配另一个实例。

可是有两个要求:

1因为做成库提供使用,不能要求调用者显示实例化,像这样调用:fun<int>(&x);//将匹配到指针版本

2上面图中例子,如果去掉模板中的const,似乎可以达到目的,使第二个调用匹配到指针版本,但是就不能用于const指针了。可以提供一个const指针版,一个非const指针版,但是我不想这么做,这样会增加模板带来的自动生成的代码量。


有没有科学一点的方法?
...全文
273 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2019-04-19
  • 打赏
  • 举报
回复

#include <iostream>
#include <type_traits>

using namespace std;

//排除对指针类型的匹配,C++11以上标准
template<class T,class = typename std::enable_if<!std::is_pointer<T>::value,T>::type>
void fun(T x){
    cout<<"fun(T x)"<<endl;
}

template<class T>
void fun(const T *x){
    cout<<"fun(const T *x)"<<endl;
}

int main()
{
    int a = 10;
    fun(a);
    fun(&a);
    return 0;
}
幻夢之葉 2019-04-19
  • 打赏
  • 举报
回复
楼上已经给出解决方案了 或者特化参数列表为 T *var 的版本(未验证) 我觉得这个设计不太合理, const形参一层意义是函数表明自己不会通过指针修改,可是这里设计者似乎认为非const指针转换为const会有一定的代价,导致上面的匹配,指针版劣于非指针版。 传入非const指针,编译器不知道你是否有需要修改指针指向内存。所以它怎么给你匹配一个const版本?
第1章 C++面向对象程序设计  1.1 抽象数据类型  1.2 封装  1.3 继承  1.4 指针   1.4.1 指针与数组   1.4.2 指针与复制构造函数   1.4.3 指针与析构函数   1.4.4 指针和引用变量   1.4.5 函数指针  1.5 多态性  1.6 C++和面向对象程序设计  1.7 标准模板库   1.7.1 容器   1.7.2 迭代器   1.7.3 算法   1.7.4 函数对象  1.8 标准模板库中的向量  1.9 数据结构与面向对象编程  1.10 案例分析:随机访问文件  1.11 习题  1.12 编程练习  参考书目 第2章 复杂度分析  2.1 计算复杂度以及渐近复杂度  2.2 大O表示法  2.3 大O表示法的性质  2.4 Ω表示法与Θ表示法  2.5 可能存在的问题  2.6 复杂度示例  2.7 确定渐近复杂度示例  2.8 最好、平均和最坏情况  2.9 摊销复杂度(amortized complexity)  2.10 NP完整性  2.11 习题  参考书目 第3章 链表  3.1 单向链表   3.1.1 插入   3.1.2 删除   3.1.3 查找  3.2 双向链表  3.3 循环链表  3.4 跳跃链表(skip list)  3.5 自组织链表  3.6 稀疏表  3.7 标准模板库中的链表  3.8 小结  3.9 案例分析:图书馆  3.10 习题  3.11 编程练习  参考书目 第4章 栈与队列  4.1 栈  4.2 队列  4.3 优先队列  4.4 标准模板库中的栈  4.5 标准模板库中的队列  4.6 标准模板库中的优先队列  4.7 标准模版库中的双端队列  4.8 案例分析:迷宫问题  4.9 习题  4.10 编程练习  参考书目 第5章 递归 第6章 二叉树 第7章 多叉树 第8章 图 第9章 排序 第10章 散列 第11章 数据压缩 第12章 内存管理 第13章 字符串匹配 附录A 计算大O 附录B 标准模板库中的算法 附录C NP完整性

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧