неразрешенный тип перегруженной функции со статической функцией в std::function

Я получаю сообщение об ошибке «неразрешенный тип перегруженной функции» при попытке передать перегруженную статическую функцию в std::function.

Мне известны похожие вопросы, такие как это и это. Однако, несмотря на то, что ответы там работают для получения адреса правильной функции в указатель функции, они терпят неудачу с std::function. Вот мой MWE:

#include <string>
#include <iostream>
#include <functional>

struct ClassA {
  static std::string DoCompress(const std::string& s) { return s; }
  static std::string DoCompress(const char* c, size_t s) { return std::string(c, s); }
};

void hello(std::function<std::string(const char*, size_t)> f) {
  std::string h = "hello";
  std::cout << f(h.data(), h.size()) << std::endl;
}

int main(int argc, char* argv[]) {
  std::string (*fff) (const char*, size_t) = &ClassA::DoCompress;
  hello(fff);
  hello(static_cast<std::string(const char*, size_t)>(&ClassA::DoCompress));
}

Может ли кто-нибудь объяснить, почему static_cast не работает, когда работает неявный?


person David Nemeskey    schedule 28.10.2015    source источник
comment
... когда это делает неявный? То, что он компилируется без ошибок, заключается в том, что он будет выполнять приведение типов независимо от задействованных типов. Это похоже на применение reinterpret_cast<>.   -  person πάντα ῥεῖ    schedule 28.10.2015
comment
@πάντα ῥεῖ Верно, но в моем случае даже reinterpret_cast не сработало. Знание того, в чем была моя ошибка, конечно, делает очевидным, почему. :)   -  person David Nemeskey    schedule 28.10.2015


Ответы (1)


Вы не можете привести к типу функции. Вероятно, вы имели в виду приведение к типу указателя:

hello(static_cast<std::string(*)(const char*, size_t)>(&ClassA::DoCompress));
//                           ^^^
person Piotr Skotnicki    schedule 28.10.2015
comment
Понятно, значит, правильные ответы, потому что я тупой. :) Тогда небольшой дополнительный вопрос: для чего тогда подходят типы функций? Только для использования в качестве параметров шаблона, например. std::function? - person David Nemeskey; 28.10.2015
comment
@DavidNemeskey И за создание указателей и ссылок на них. Например. using FuncType = double (int, char); FuncType *f = &myFunc; - person Angew is no longer proud of SO; 28.10.2015
comment
@DavidNemeskey тип функции действителен в некоторых контекстах, не связанных с метапрограммированием - person Piotr Skotnicki; 28.10.2015