Является ли свойство C ++ is_lambda, реализованное исключительно в виде библиотеки, невозможным?

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

10
задан Motti 12 January 2011 в 09:27
поделиться