Создать функтор из класса метафункций MPL - PullRequest
1 голос
/ 23 ноября 2011

Я искал класс в MPL, который будет создавать функциональный объект из достаточно метафункционального класса MPL. Я вручную свернул эту реализацию:

  template <class Lambda, class Result>
  struct functor
  {
      typedef Result result_type;

      template <typename Type>
      Result operator()( Type ) 
           { return Lambda::template apply<Result>::type::value; }
  };

Пример использования будет

  Foo foo;
  return functor< boost::mpl::always<boost::mpl::int_<5> >, int >( foo );

как прославленный вариант написания return 5.

Поскольку эта операция кажется довольно простой, я бы подумал, что в MPL уже есть подобный класс, но поиск документации для меня ничего не дал. Я что-то упустил?

1 Ответ

1 голос
/ 23 ноября 2011

Я не думаю, что в Boost.MPL есть такой класс, поскольку он ориентирован исключительно на вычисления во время компиляции.Этот тип оболочки лучше хранить в Boost.Fusion , который предназначен для установления связи между компиляцией и объектами времени выполнения, но я ничего не нашел.

Я думаю, вам придетсяиспользуйте свою собственную реализацию, которая с первого взгляда кажется хорошей (хотя я бы предпочел использовать mpl::apply для обработки выражений-заполнителей).Я думаю, вы также можете опустить тип возвращаемого значения, поскольку он может быть выведен из лямбды.

Вот альтернативная реализация, использующая apply и определяющая тип возвращаемого значения из лямбды:

template < typename Lambda >
struct functor
{
    template < typename Type >
    typename boost::mpl::apply< Lambda, Type >::type::value_type 
    operator()( Type ) 
    { 
        return boost::mpl::apply< Lambda, Type >::type::value; 
    }
};

// sample use:
int main()
{
    boost::mpl::int_<5> five;
    std::cout << functor< boost::mpl::identity< boost::mpl::_ > >()( five );
    // Output "5"
}
...