Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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::bind的类型定义_C++_Boost_Typedef_Boost Bind - Fatal编程技术网

C++ 对应于boost::bind的类型定义

C++ 对应于boost::bind的类型定义,c++,boost,typedef,boost-bind,C++,Boost,Typedef,Boost Bind,由于boost的绑定功能,我编译了以下代码,将非静态成员函数作为参数传递给需要全局函数参数的地方。请注意,我省略了很多细节,但我的用例只是将一个非静态成员函数作为参数传递,我需要一个typedef用于此函数,请参见下面代码段中的代码注释: #include <boost/tuple/tuple.hpp> #include <boost/function.hpp> #include <boost/bind.hpp> #include <Eigen/Dens

由于boost的绑定功能,我编译了以下代码,将非静态成员函数作为参数传递给需要全局函数参数的地方。请注意,我省略了很多细节,但我的用例只是将一个非静态成员函数作为参数传递,我需要一个
typedef
用于此函数,请参见下面代码段中的代码注释:

#include <boost/tuple/tuple.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <Eigen/Dense>

// ridge solver using conjugate gradient
template <>
inline void SomeANN<kConjugateGradient>::ridge_solve(const VectorXd& Y) {
    // horrendous typedef I'd like to get rid of
    typedef _bi::bind_t<tuples::tuple<double, VectorXd >, 
      _mfi::mf1<tuples::tuple<double, VectorXd>,
        SomeANN<(Minimizer)1u>, const VectorXd&>, _bi::list2<_bi::value<SomeANN<(Minimizer)1u>*>,  
          boost::arg<1> > > oracle_f;
    // I'd prefer this typedef instead of the ugly one above but doesn't compile
    //typedef tuple<double, VectorXd> (SomeANN<kConjugateGradient>::*oracle_f)(const VectorXd&);
    ConjugateGradient<BeginSpace, VectorXd, oracle_f> optimizer;
    // ...
    optimizer.search(BeginSpace(Y.rows()), boost::bind(&SomeANN<kConjugateGradient>::f, this, ::_1));
}

// definition of f. I need to pass this function as parameter to CG
template <>
inline tuple<double, VectorXd> SomeANN<kConjugateGradient>::f(const VectorXd& theta) {
    // TODO: implement properly
    double f = 0.0;
    VectorXd df;
    return make_tuple(f, df);
}
#包括
#包括
#包括
#包括
//使用共轭梯度的脊线解算器
模板
内联void SomeANN::ridge_solve(常量向量xd&Y){
//我想摆脱可怕的类型定义
typedef_bi::bind_t oracle_f;
//我更喜欢这个typedef,而不是上面丑陋的一个,但是不编译
//typedef元组(SomeANN::*oracle_f)(const VectorXd&);
共轭梯度优化器;
// ...
search(BeginSpace(Y.rows()),boost::bind(&SomeANN::f,this,:1));
}
//f的定义。我需要把这个函数作为参数传递给CG
模板
内联元组SomeANN::f(常量向量xd和θ){
//TODO:正确实施
双f=0.0;
矢量xd-df;
返回make_元组(f,df);
}

但是上面我从前面的错误消息中获取的
typedef
非常难看,我想使用一些更可读的东西,比如行注释的
typedef元组(SomeANN::*oracle_f)(const VectorXd&)但它不会编译。我需要一个用于
oracle\u f
的typedef,以便能够在声明
共轭梯度优化器中指定正确的模板参数

如何使用
boost::function

typedef boost::function<tuples::tuple<double, VectorXd>(const VectorXd&)> oracle_f;
typedef boost::函数oracle\u f;

很抱歉,如果没有C++11的
decltype
auto
,您将不得不使用大而丑陋的类型(实际上是Boost.Bind的一个实现细节),或者使用
Boost::function
删除该类型,这将导致每次调用都需要间接寻址


搜索本身不是你上一个问题中的模板吗?

谢谢你,Sebastian,上面的解决方案很好。我必须经过安装过程才能在C++11上获得我的环境。你说每次通话都是间接的是什么意思?通过使用typedef?这里还可以使用Boost的typeof-@Vlad为什么还远远不够完美?我的意思是它编译得很完美,至少它是可读的:D