Правила определения набора типов функций, совместимых с std::function?

Предположим, если у меня есть это,

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

5
задан Nawaz 28 November 2011 в 15:17
поделиться