I'm trying without success to use a boost::bind with a boost::factory
I have this class Zambas with 4 arguments (2 strings and 2 ints) and
class Zambas {
public:
Zambas(const std::string&, const std::string&,int z1=0,int z2=0) {
if (z1==z2){
}
}
};
inside other method i have the following call
boost::function<Zambas*()> f(boost::bind(boost::factory<Zambas*>(), std::string(""), std::string(""),_1,_2));
that fails with the following compiler error:
bind.hpp:382: error: no match for ‘operator[]’ in ‘a[boost::_bi::storage3<A1, A2, boost::arg<I> >::a3_ [with A1 = boost::_bi::value<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, A2 = boost::_bi::value<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, int I = 1]]’
What I'm doing wrong ?
The
bind
function returns a two-argument functor because you bound the third and fourth parameters of your constructor to the placeholder values_1
and_2
. However, you're storing the result in a zero-argumentfunction
object.I found a reference from six years ago explaining that you can't omit parameters when you bind a function, even if they're declared with default values.
I think you have three options:
int
values in your call tobind
instead of placeholders.f
to indicate that it stores a two-argument function, and then always provide both values when you call it.f
.The last option will probably just make your code harder to read without much benefit, so prefer one of the first two options instead.