У меня есть следующий код, который компилируется благодаря возможности связывания boost для передачи нестатической функции-члена в качестве параметра, где ожидается глобальный параметр функции. Обратите внимание, что я опускаю много деталей, но мой вариант использование просто передать нестатические функции члена в качестве параметра, и мне нужен typedef
для этой функции см комментариев кода в приведенном ниже фрагменте коды:определение типа, соответствующее boost :: bind
#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&);
, но она не будет компилироваться. Мне нужно typedef для oracle_f
, чтобы иметь возможность указать правильный параметр шаблона в объявлении ConjugateGradient<BeginSpace, VectorXd, oracle_f> optimizer;
.
Он отлично работает благодаря вам! –
@GiovanniAzua: Далек от «отлично», но он действительно работает. –
@ Vlad почему далеко не отлично? Я имел в виду, что он отлично компилируется и, по крайней мере, доступен для чтения: D –