Обернуть перегруженную функцию через std::function
У меня есть перегруженная функция, которую я хочу передать, завернутый в std::function. GCC4.6 не находит "подходящей функции". Хотя я нашел здесь несколько вопросов, ответы не так ясны, как хотелось бы. Может кто-нибудь сказать мне, почему следующий код не может вывести правильную перегрузку и как (элегантно) обойти это?
int test(const std::string&) {
return 0;
}
int test(const std::string*) {
return 0;
}
int main() {
std::function<int(const std::string&)> func = test;
return func();
}
1 ответ
Это неоднозначная ситуация.
Чтобы устранить неоднозначность, используйте явное приведение как:
typedef int (*funtype)(const std::string&);
std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast!
Теперь компилятор сможет устранить неоднозначность ситуации, основываясь на типе в приведении.
Или вы можете сделать это:
typedef int (*funtype)(const std::string&);
funtype fun = test; //no cast required now!
std::function<int(const std::string&)> func = fun; //no cast!
Так почему std::function<int(const std::string&)>
не работает так funtype fun = test
работает выше?
Ну, ответ, потому что std::function
может быть инициализирован любым объектом, так как его конструктор является шаблоном, который не зависит от аргумента шаблона, который вы передали std::function
,