Предположим, если у меня есть это,
std::function<int(int,int)> fs;
, то как я могу определить набор функций (или функциональных объектов), с которыми fs
может быть инициализирован?
Какой изРазрешено следующее, а что нет:
std::function<int(int,int)> fs = [](int, int) { return int(10); };
std::function<int(int,int)> fs = [](char, char) { return char(10); };
std::function<int(int,int)> fs = [](int, short) { return int(10); };
std::function<int(int,int)> fs = [](double, int) { return float(10); };
std::function<int(int,int)> fs = [](int, wchar_t) { return wchar_t(10); };
std::function<int(int,int)> fs = [](const char*, int){ return "string"; };
std::function<int(int,int)> fs = [](const char*, int){ return 10; };
std::function<int(int,int)> fs = [](const char*, int){ return std::string(); };
Конечно, я могу скомпилировать и посмотреть, какой из них компилируется нормально, а какой нет.Но это не помогает мне понять различия в типах параметров и типе возвращаемого значения.Как далеко я могу пойти, чтобы использовать различные типы для них?
Иными словами, если я дал функцию (или функциональный объект), как я могу определить во время компиляции, совместима ли она с std::function<int(int,int)>
или нет?У меня мало понимания, но я не достаточно уверен в этом.
Поэтому, пожалуйста, помогите мне понять и изложить правила определения набора типов функций, совместимых с std::function<R(T1,T2)>
?Может ли метапрограммирование помочь мне здесь уведомлять пользователей, генерируя красивые сообщения об ошибках, если они используют несовместимую функцию?
Кстати, первая группа кажется совместимой: http://ideone.com/hJpG3