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