У меня вопрос по поводу C ++ 0x лямбда-выражений.В моем коде было бы полезно узнать, является ли данный тип типом лямбда-выражения C ++ 0x.Для примера:
struct foobar
{
void operator()()
{
}
};
auto lambda = []{};
typedef is_lambda < decltype(lambda) > ::type T; // T would be a true_type
typedef is_lambda < foobar > ::type T; // T would be a false_type
Довольно легко отличить лямбда-выражения от типов функций и функций-членов.Функторы - это другое дело.
Проблема, которую я вижу здесь, заключается в определении лямбда-выражений в соответствии с готовящимся стандартом C ++ 0x;единственное, что должно быть определено, это оператор публичного вызова.Однако это верно и для функтора;проверки на наличие оператора вызова недостаточно для различения лямбда-выражений от функторов.Кроме того, если оператор функтора отсутствует , то произойдет ошибка компилятора, поскольку SFINAE не применяется.Когда это происходит?Оператор вызова функтора может быть шаблонным.Таким образом, такой код:
typedef decltype(&T::operator()) call_type;
будет работать как для лямбда-выражений, так и для функторов с не шаблонным оператором вызова и генерировать ошибку компилятора для операторов шаблонного вызова.1013 * черта может быть создана только с использованием встроенных функций компилятора.Вы видите способ реализации этой черты?