Проблема с boost::bind, boost::function и boost::factory

Я безуспешно пытаюсь использовать boost::bind с boost::factory

У меня есть этот класс Zambas с 4 аргументами (2 строки и 2 целых числа) и

class Zambas {

public:

Zambas(const std::string&, const std::string&,int z1=0,int z2=0) {    
      if (z1==z2){

      }
    }
};

внутри другого метода у меня есть следующий вызов

boost::function<Zambas*()> f(boost::bind(boost::factory<Zambas*>(), std::string(""), std::string(""),_1,_2));

это не удается со следующей ошибкой компилятора:

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]]’

Что я делаю неправильно?


person Alexandre    schedule 16.03.2011    source источник


Ответы (1)


Функция bind возвращает функтор с двумя аргументами, потому что вы связали третий и четвертый параметры вашего конструктора со значениями-заполнителями _1 и _2. Однако вы сохраняете результат в объекте function без аргументов.

Я нашел ссылку шестилетней давности, объясняющую, что вы можете нельзя опускать параметры при привязке функции, даже если они объявлены со значениями по умолчанию.

Я думаю, у вас есть три варианта:

  1. Укажите фактические значения int в вызове bind вместо заполнителей.
  2. Измените объявление f, чтобы указать, что он хранит функцию с двумя аргументами, а затем всегда предоставляйте оба значения при ее вызове.
  3. Свяжите последние два параметра с переменными. См. раздел Задержка констант и переменных в документация Boost.Lambda. Затем вы можете установить для этих переменных те же значения по умолчанию, которые объявляет конструктор. Чтобы использовать значения по умолчанию, больше ничего не делайте. Чтобы указать значения, отличные от значений по умолчанию, присвойте значения этим переменным перед вызовом f.

Последний вариант, вероятно, просто затруднит чтение вашего кода без особой пользы, поэтому вместо этого отдайте предпочтение одному из первых двух вариантов.

person Rob Kennedy    schedule 16.03.2011