Можно ли наследовать от boost :: function? - PullRequest
4 голосов
/ 10 марта 2011

Я хотел бы знать, возможно ли наследовать от boost :: function.

По сути, для простоты использования мне хотелось бы иметь тип «Делегат», который в основном являетсяповышение :: функции.Это просто для простоты использования в некотором коде, который я пишу.

В какой-то момент я typedef повысил бы :: function для Delegate, но typedef'ing в моем опыте играет с GDB.Особенно, если это шаблонно, поэтому я хотел избежать этого (когда-нибудь пытался отлаживать stl-контейнеры, которые были набраны? Oofta).

В сети я нашел некоторый код, который привел некоторый пример:*

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

Tank * tankptr = new Tank();
Delegate<void ()> tankShoot(boost::bind(boost::mem_fn(&Tank::Shoot),tankptr));

Это приводит к ошибкам, таким как

error: no matching function for call to ‘Delegate<void ()()>::Delegate(boost::_bi::bind_t<boost::_bi::unspecified, boost::_mfi::mf0<void, Tank>, boost::_bi::list1<boost::_bi::value<Tank*> > >)’
Delegate.h:26: note: candidates are: Delegate<void ()()>::Delegate()
Delegate.h:26: note:                 Delegate<void ()()>::Delegate(const Delegate<void()()>&)

Если бы мне пришлось угадывать, почему я получаю эти ошибки, я должен был бы сказать, что причинаЯ пропускаю какой-то конструктор копирования, который использует любую базу, которую возвращает конструктор boost :: bind.

Любые мысли о том, как я могу преодолеть это препятствие, или любой, кто сможет указать мне на хорошие примеры наследования отповышение :: функции?

Ответы [ 2 ]

6 голосов
/ 10 марта 2011

Извлечение из класса не автоматически «наследует» конструкторы базового класса для производного класса.Там вам нужно будет создать все необходимые конструкторы.

0 голосов
/ 11 марта 2011

hKaiser был прав, когда мне нужно было написать необходимые конструкторы.

У меня было чертовски много времени, пока я не нашел файл интерфейса для класса boost "function" на их сайте.

В итоге я получил что-то вроде:

template<class Signature>
class Delegate : public boost::function<Signature>
{
public:
  ///use the functor operator from the original class
  using boost::function<Signature>::operator();

  ///base constructor for our new type, 
  Delegate() : boost::function<Signature>() {/*empty*/}

  ///copy constructor for our new type
  Delegate(const boost::function<Signature>& x) : boost::function<Signature>(x) {/*empty*/}

  Delegate& operator=(const Delegate & _delegate)
  {
    boost::function<Signature> x = _delegate;
    try
    {
      dynamic_cast<boost::function<Signature> & >(*this) = x;
    }
    catch(bad_cast &bc)
    {
      cout << "Bad Cast Exception. " << bc.what();
      int * ptr = NULL;
      *ptr = 1; //force seg fault instead of assert
    }
    return *this;
  }
};

Я не уверен, правильно ли я использую dynamic_cast (в контексте соблюдения хороших методов кодирования) или если яон даже нужен в операторе присваивания, но он работает и работает очень хорошо.

...