Избавление от ссылок в последовательности boost::fusion

Я пытаюсь использовать Boost::Fusion для преобразования списка типов параметров функции в fusion::list. В конечном счете, я пытаюсь превратить список переменных в параметры, с которыми я могу вызвать функцию (http://stackoverflow.com/questions/11164914/generating-wrappings-for-c-functions).

Я заставил это работать для нессылочных переменных. Однако он не скомпилируется для нессылочных переменных, когда я пытаюсь включить список параметров функции (в частности, в fusion::to_list он жалуется, что не может удалить итератор).

Я упростил код немного ниже:

struct identity {
  template<typename Sig> struct result;

  template <typename T>
  struct result<convert(T)> { typedef T type; };

  template <typename T>
  typename T operator ()(T) const { 
     return T();
  }
};

int main(int argc, char **argv) {
  typedef BOOST_TYPEOF(foo) params_type;
  auto seq = function_types::parameter_types<params_type>();
  auto transformed = fusion::transform(seq, identity());
  auto passedParams = fusion::as_list(transformed);
}

Если foo определяется как:

int foo(int a) { return 5*a; }

работает нормально, но ломается:

int foo(int &a) { return 5*a; }

Для целей моего кода мне на самом деле не нужны ссылки, хранящиеся в последовательности, что, как я предполагаю, является проблемой (также поиски, которые я сделал, как правило, указывают на то, что это виновник). Однако я не совсем уверен, как удалить эти ссылки из функции transformed перед вызовом as_list.

Я пробовал что-то вроде:

template <typename T>
struct result<convert(T)>: remove_reference<T> {};

template <typename T>
typename remove_reference<T>::type operator ()(remove_reference<T>::type) const { return typename remove_reference<T>::type(); }

но получил те же ошибки компиляции.

Есть идеи, как это исправить?

обновить

Вот усеченная ошибка компилятора, которую я получаю (с clang++ --std=c++0x) для обоих случаев, указанных выше:

/usr/local/include/boost/fusion/adapted/mpl/mpl_iterator.hpp:43:24: error: 
      reference to type 'int' requires an initializer
                return type();
                       ^
/usr/local/include/boost/fusion/iterator/deref.hpp:61:28: note: in instantiation
  of member function
  'boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::function_types::parameter_types<void
  (int &), boost::add_reference<mpl_::arg<-1> > >, 0>
  >::deref<boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::function_types::parameter_types<void
  (int &), boost::add_reference<mpl_::arg<-1> > >, 0> > >::call' requested
  here
    return deref_meta::call(i);

...

test4.cpp:65:22: note: in instantiation of function template specialization
  'boost::fusion::as_list<boost::fusion::transform_view<const
  boost::function_types::parameter_types<void (int &),
  boost::add_reference<mpl_::arg<-1> > >, convert, boost::fusion::void_> >'
  requested here
    auto passedParams = fusion::as_list(transformed);

person Abe Schneider    schedule 26.06.2012    source источник
comment
Если вы получаете ошибки компиляции, было бы неплохо отредактировать свой вопрос, чтобы включить их.   -  person Some programmer dude    schedule 26.06.2012
comment
Сойдет - я избегал этого, потому что это ошибка шаблона, и поэтому его долго и сложно анализировать. Из-за этого я включил (выше) последнюю ошибку, которую выдает компилятор (при вызове as_list в deref_impl).   -  person Abe Schneider    schedule 26.06.2012
comment
Хорошо, я добавил сокращенную форму ошибки. Могу добавить еще, если поможет, трассировка проходит через: defer.hpp -> defer_impl.hpp -> defer.hpp -> build_cons.hpp -> convert.hpp -> test4.cpp   -  person Abe Schneider    schedule 26.06.2012


Ответы (1)


Если ваш компилятор совместим с C++11, вы можете заглянуть в `std:: функция remove_reference. Или, по крайней мере, попробуйте найти его реализацию и использовать в качестве эталона для создания своей собственной.

person Some programmer dude    schedule 26.06.2012
comment
Я пробовал remove_reference (см. выше), но, возможно, применил его неправильно. Можете ли вы привести какой-нибудь пример применения этого к представлению Fusion? - person Abe Schneider; 26.06.2012