Обернуть перегруженную функцию через 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,

Другие вопросы по тегам