只是一般的c ++好奇心:
下面的代码不应该编译,因为在调用func(temp)时不可能知道实例化哪个: temp(const int&)或temp(const string&) - 这部分我知道。
我想知道的是,如果我可以对标有 PASSINGLINE 的行做些什么来让编译器推断我想要 FPTR1 而不是< b> FPTR2 ?
#include<iostream>
using std::cout;
using std::endl;
/*FPTR1*/ void func(void(*fptr)(const int&)){ fptr(1001001);}
/*FPTR2*/ void func(void(*fptr)(const string&)){ fptr("1001001"); }
template <typename T>
void temp(const T &t){ cout << t << endl; }
int main(){
/*PASSINGLINE*/ func(temp);
return 0;
}
谢谢。
答案 0 :(得分:2)
您可以使用static_cast
:
func (static_cast <void(*)(const int&)> (&temp));
使用GCC 4.x进行测试。
答案 1 :(得分:2)
func(temp<int>);
在这种情况下,没有办法让编译器推断出模板参数,这比仅仅明确指定它更简洁或更清晰。
编辑:以下代码在没有警告的情况下编译并产生预期结果:
#include<iostream>
#include<string>
using std::string;
using std::cout;
using std::endl;
/*FPTR1*/ void func(void(*fptr)(const int&)){ fptr(1001001);}
/*FPTR2*/ void func(void(*fptr)(const string&)){ fptr("1001001"); }
template <typename T>
void temp(const T &t){ cout << t << endl; }
int main(){
/*PASSINGLINE*/ func(temp<int>);
return 0;
}