Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 消除boost::fusion序列中的引用_C++_Templates_Boost_Reference_Boost Fusion - Fatal编程技术网

C++ 消除boost::fusion序列中的引用

C++ 消除boost::fusion序列中的引用,c++,templates,boost,reference,boost-fusion,C++,Templates,Boost,Reference,Boost Fusion,我试图使用Boost::Fusion将函数的参数类型列表转换为Fusion::list。最后,我试图将变量列表转换为参数,以便调用函数(http://stackoverflow.com/questions/11164914/generating-wrappings-for-c-functions) 我已经让它对非引用变量起作用了。但是,当我试图打开函数的参数列表时(特别是在fusion::to_列表上,它抱怨无法取消迭代器的引用),它无法编译非引用变量 我将代码简化了一点,如下所示: struc

我试图使用Boost::Fusion将函数的参数类型列表转换为Fusion::list。最后,我试图将变量列表转换为参数,以便调用函数(http://stackoverflow.com/questions/11164914/generating-wrappings-for-c-functions)

我已经让它对非引用变量起作用了。但是,当我试图打开函数的参数列表时(特别是在fusion::to_列表上,它抱怨无法取消迭代器的引用),它无法编译非引用变量

我将代码简化了一点,如下所示:

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);
}
它工作正常,但会出现以下问题:

int foo(int &a) { return 5*a; }
就我的代码而言,我实际上不需要保留在序列中的引用,我假设这就是问题所在(而且,我所做的搜索往往会指出这是罪魁祸首)。但是,在调用
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(); }
模板
结构结果:删除_引用{};
模板
typename remove_reference::type运算符()(remove_reference::type)const{return typename remove_reference::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);
/usr/local/include/boost/fusion/adapted/mpl/mpl\u迭代器。hpp:43:24:错误:
对类型“int”的引用需要初始值设定项
返回类型();
^
/usr/local/include/boost/fusion/iterator/deref.hpp:61:28:注意:在实例化中
成员函数
请求“boost::fusion::mpl\u迭代器::deref::call”
在这里
返回deref_meta::call(i);
...
test4.cpp:65:22:注意:在函数模板专门化的实例化中
'boost::fusion::as_list'
在此请求
自动传递参数=fusion::as_列表(已转换);

如果您的编译器与C++11兼容,您可能需要查看函数。或者至少尝试找到它的一个实现,并将其用作自己的参考。

如果您的编译器与C++11兼容,您可能需要研究该函数。或者至少试着找到它的一个实现,并将其作为您自己的编译的参考。

如果您遇到编译错误,最好编辑您的问题以包含它们。可以--我避免这样做,因为这是模板错误,因此很长,很难解析。因此,我(在上面)包含了编译器给出的最后一个错误(在deref_impl中调用as_list时)。如果有帮助的话,我可以包含更多的内容,跟踪贯穿始终:defer.hpp->defer\u impl.hpp->defer.hpp->build\u cons.hpp->convert.hpp->test4.cpp如果您出现编译错误,最好编辑您的问题以包含它们。这样做可以--我避免这样做,因为这是模板错误,因此很长,很难解析。因此,我(在上面)包含了编译器给出的最后一个错误(在deref_impl中调用as_list时)。如果有帮助的话,我可以包含更多内容,跟踪运行:defer.hpp->defer\u impl.hpp->defer.hpp->build\u cons.hpp->convert.hpp->test4.cpp我尝试过删除\u引用(见上文),但可能没有正确应用它。你能给出一个将它应用于fusion视图的例子吗?我确实尝试过删除_引用(见上文),但可能没有正确地应用它。你能给出一个将其应用于融合视图的例子吗?
/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);