Возможно ли написать мета-функцию С++ (0x), которая определяет, является ли тип вызываемым?
Под вызываемым типом я подразумеваю тип функции, тип указателя функции, тип ссылочного типа (они обнаруживаются с помощью boost::function_types::is_callable_builtin
), типы лямбда и любой класс с перегруженным operator()
(и, возможно, любым классом с неявным преобразованием оператора к одному из них, но это не совсем необходимо).
РЕДАКТИРОВАТЬ. Metafunction должен обнаруживать наличие operator()
с любой подписью, включая шаблонный operator()
. Я считаю, что это трудная часть.
EDIT. Вот пример использования:
template <typename Predicate1, typename Predicate2>
struct and_predicate
{
template <typename ArgT>
bool operator()(const ArgT& arg)
{
return predicate1(arg) && predicate2(arg);
}
Predicate1 predicate1;
Predicate2 predicate2;
};
template <typename Predicate1, typename Predicate2>
enable_if<ice_and<is_callable<Predicate1>::value,
is_callable<Predicate2>::value>::value,
and_predicate<Predicate1, Predicate2>>::type
operator&&(Predicate1 predicate1, Predicate2 predicate2)
{
return and_predicate<Predicate1, Predicate2>{predicate1, predicate2};
}
is_callable
- это то, что я хотел бы реализовать.