如何让模板函数匹配到引用类型的特化上?

firerun 2017-11-03 03:39:54
下面的代码,2次都输出的是int,如何才能调用到int&这个特例化函数?

#include <stdio.h>

template<typename T>
void func(T arg)
{
printf("var\n");
}

template<>
void func(int arg)
{
printf("int\n");
}

template<>
void func(int &arg)
{
printf("int &\n");
}


int main(int argc, char *argv[])
{
int n1;
int &n2 = n1;

func(n1);
func(n2);

return 0;
}
...全文
179 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
firerun 2017-12-08
  • 打赏
  • 举报
回复
4楼的回答虽然是正确的,但是却失去了模板和重载的意义。 模板这样可以编译通过,如果是重载的话,在调用时就会报二义性错误。
棉猴 2017-11-06
  • 打赏
  • 举报
回复
如果想调用func(int&)函数,则需要通过显示转换操作符static_cast将函数进行转换 static_cast<void(*)(int&)>(func)(refvalue); 以上内容摘自《C++的引用与重载函数》 http://blog.csdn.net/hou09tian/article/details/77425358 希望能帮到你
xskxzr 2017-11-06
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:


template<typename T, typename F = typename std::enable_if<std::is_reference<T>::value>::type>
void func(T& arg)
{
    printf("T &\n");
}
没用的。问题在于实参n1和n2没有本质区别,所以编译器无法自动区分。
小竹z 2017-11-03
  • 打赏
  • 举报
回复
试试func(ref(n2));
sdghchj 2017-11-03
  • 打赏
  • 举报
回复


template<typename T, typename F = typename std::enable_if<std::is_reference<T>::value>::type>
void func(T& arg)
{
    printf("T &\n");
}

64,632

社区成员

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

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