Передача шаблона функции. как функционал. ptr для перегруженной функции. - Есть ли способ скомпилировать этот код? - PullRequest
0 голосов
/ 06 июня 2010

Просто общее любопытство c ++:

Этот код ниже не должен компилироваться, потому что невозможно знать, какой экземпляр создать: temp (const int &) или temp (const string &) при вызове func (temp) - эту часть я знаю.

Что я хотел бы знать, так это то, что я могу что-то сделать для строки, помеченной PASSINGLINE , чтобы заставить компилятор сделать вывод, что я хочу, чтобы FPTR1 вызывался, а не 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 ]

2 голосов
/ 06 июня 2010
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;
}
2 голосов
/ 06 июня 2010

Вы можете использовать static_cast:

func (static_cast <void(*)(const int&)> (&temp));

Протестировано с GCC 4.x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...