Я пытаюсь использовать 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);