Как определить, является ли тип лямбда-выражением во время компиляции?

Предположим, у меня есть тип my_struct , включающий переменную-член, f , которая является функцией . f может быть лямбда-функцией С ++ 11.

Поскольку присвоение лямбда-объектам запрещено, я хотел бы реализовать оператор присваивания my_struct таким образом, чтобы, когда f является лямбда-выражением, это не назначенный.

Можно ли создать свойство типа is_lambda , которое может проверять тип на лямбда-сущность?

В коде:

#include <type_traits>

template<typename Function> struct is_lambda
{
  // what goes here?
};

template<typename Function> struct my_struct
{
  Function f;

  my_struct &do_assign(const my_struct &other, std::true_type)
  {
    // don't assign to f
    return *this;
  }

  my_struct &do_assign(const my_struct &other, std::false_type)
  {
    // do assign to f
    f = other.f;
    return *this;
  }

  my_struct &operator=(const my_struct &other)
  {
    return do_assign(other, typename is_lambda<Function>::type());
  }
};
6
задан Jared Hoberock 13 December 2011 в 07:03
поделиться