传递模板功能。作为一个功能。 ptr到一个重载的函数。 - 有没有办法编译这段代码?

时间:2010-06-06 17:41:06

标签: c++ templates function-pointers

只是一般的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;
}

谢谢。

2 个答案:

答案 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;
}