1

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);
4

1 に答える 1

1

コンパイラが C++11 と互換性がある場合は、`std::remove_reference関数を調べることをお勧めします。または、少なくともその実装を見つけて、独自のものを作成するための参照として使用してください。

于 2012-06-26T05:27:53.677 に答える