与boost :: bind对应的类型定义

时间:2013-05-30 15:51:25

标签: c++ boost typedef boost-bind

我有以下代码编译,感谢boost的bind工具将非静态成员函数作为参数传递,其中需要一个全局函数参数。请注意,我省略了很多细节,但我的用例只是将非静态成员函数作为参数传递,我需要typedef这个函数,请参阅下面代码段中的代码注释: / p>

#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);
}

但我上面使用的typedef是我从上一个错误消息中获取的,是非常丑陋的,并且想要使用比评论typedef tuple<double, VectorXd> (SomeANN<kConjugateGradient>::*oracle_f)(const VectorXd&);行更可读的内容,但它不会编译。我需要oracle_f的typedef才能在声明ConjugateGradient<BeginSpace, VectorXd, oracle_f> optimizer;中指定正确的模板参数。

2 个答案:

答案 0 :(得分:2)

很抱歉,但是如果没有C ++ 11的decltypeauto,你就会陷入使用大丑陋类型(真的是Boost.Bind的实现细节),或者使用boost::function来清除类型,这会导致每次调用都出现间接成本。

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

答案 1 :(得分:1)

如何使用boost::function

typedef boost::function<tuples::tuple<double, VectorXd>(const VectorXd&)> oracle_f;