boost::bind membre de la fonction de l'application partielle de chaînage
-
12-12-2019 - |
Question
Je suis en train de la chaîne d'ensemble des fonctions curryfiées utilisation de boost::bind, et d'obtenir des erreurs de compilation que je ne peux pas résoudre.L'exemple le plus simple que je peux faire qui ne peut pas compiler:
#include <iostream>
#include <boost/bind.hpp>
class A
{
public:
template <typename F>
void g(F fn, char c)
{
fn(c);
}
void h(char c)
{
std::cout << c << std::endl;
}
template <typename F>
void f(F fn, char c)
{
boost::bind(&A::g<F>, this, fn, ::_1)(c);
}
};
int main(int argc, char** argv)
{
char c = 'a';
A a;
a.f(boost::bind(&A::h, &a, ::_1), c);
}
échoue avec ce message d'erreur:
In file included from /usr/include/boost/bind.hpp:22,
from test8.cpp:2:
/usr/include/boost/bind/bind.hpp: In member function ‘void boost::_bi::list3<A1, A2, A3>::operator()(boost::_bi::type<void>, F&, A&, int) [with F = boost::_mfi::mf2<void, A, boost::_bi::bind_t<void, boost::_mfi::mf1<void, A, char>, boost::_bi::list2<boost::_bi::value<A*>, boost::arg<1> > >, char>, A = boost::_bi::list1<char&>, A1 = boost::_bi::value<A*>, A2 = boost::_bi::bind_t<void, boost::_mfi::mf1<void, A, char>, boost::_bi::list2<boost::_bi::value<A*>, boost::arg<1> > >, A3 = boost::arg<1>]’:
/usr/include/boost/bind/bind_template.hpp:32: instantiated from ‘typename boost::_bi::result_traits<R, F>::type boost::_bi::bind_t<R, F, L>::operator()(A1&) [with A1 = char, R = void, F = boost::_mfi::mf2<void, A, boost::_bi::bind_t<void, boost::_mfi::mf1<void, A, char>, boost::_bi::list2<boost::_bi::value<A*>, boost::arg<1> > >, char>, L = boost::_bi::list3<boost::_bi::value<A*>, boost::_bi::bind_t<void, boost::_mfi::mf1<void, A, char>, boost::_bi::list2<boost::_bi::value<A*>, boost::arg<1> > >, boost::arg<1> >]’
test8.cpp:21: instantiated from ‘void A::f(F, char) [with F = boost::_bi::bind_t<void, boost::_mfi::mf1<void, A, char>, boost::_bi::list2<boost::_bi::value<A*>, boost::arg<1> > >]’
test8.cpp:29: instantiated from here
/usr/include/boost/bind/bind.hpp:385: error: invalid use of void expression
C'est à l'aide de
$ g++ --version
g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
La solution
Vous avez besoin d'utiliser boost::protect()
dans de tels cas, lorsque vous passez une liaison expression à un autre appel de liaison, mais ne veulent pas le dire un être invoquée lors de l'évaluation des arguments à l'extérieur lié à la fonction, mais souhaitez imbriquée lier l'expression être passé comme-est comme un argument à l'extérieur lié à la fonction.Ici, ce sera:
boost::bind(&A::g<F>, this, boost::protect(fn), ::_1)(c);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow