2013-05-30 6 views
1

У меня есть следующий код, который компилируется благодаря возможности связывания 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;.

ответ

1

Как об использовании boost::function?

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

Он отлично работает благодаря вам! –

+0

@GiovanniAzua: Далек от «отлично», но он действительно работает. –

+0

@ Vlad почему далеко не отлично? Я имел в виду, что он отлично компилируется и, по крайней мере, доступен для чтения: D –

2

Извините, но без 11 C++ или decltypeauto, вы застряли либо с помощью большой уродливый тип (который является деталью реализации Boost.Bind, на самом деле), либо с помощью boost::function для удаления тип, который несет стоимость косвенности при каждом вызове.

Не искал сам шаблон в вашем предыдущем вопросе?

+0

Спасибо, Себастьян, решение выше отлично работает. Я должен пройти процесс установки, чтобы получить свою среду на C++ 11. Что вы имеете в виду при указании на каждый звонок? используя typedef? –

+1

Существует также тип Boostof, который может быть использован здесь - http://www.boost.org/doc/libs/release/doc/html/typeof.html –

Смежные вопросы