У меня вопрос относительно лямбда-выражений 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;
будет работать как для лямбда-выражений, так и для функторов с нетрадиционным оператором вызова и генерировать ошибку компилятора для шаблонных операторов вызова.
Я считаю, что черта is_lambda <>
могут быть созданы только с использованием встроенных функций компилятора. Вы видите способ реализовать эту черту?