Полный пример с помощью Повышения:: Сигналы для Обработки событий C++

Похоже, у вас есть строка, которая была закодирована как UTF-8 , а затем расшифрована как cp1251 .

>>> s =  'пом'
>>> s.encode('utf-8').decode('cp1251')
'РїРѕРј'

Вы можете получить исходную строку, изменив операцию.

>>> e = 'РїРѕРј'
>>> e.encode('cp1251').decode('utf-8')
'пом'

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

>>> e.encode('ascii', errors='backslashreplace')
b'\\u0420\\u0457\\u0420\\u0455\\u0420\\u0458'
56
задан Chris Andrews 12 April 2013 в 19:20
поделиться

3 ответа

Приведенный ниже код является минимальным рабочим примером того, что вы запросили. ClassA испускает два сигнала; SigA не отправляет (и не принимает) никаких параметров, SigB отправляет int . ClassB имеет две функции, которые будут выводиться на cout при вызове каждой функции. В примере есть один экземпляр ClassA ( a ) и два из ClassB ( b и b2 ). main используется для подключения и запуска сигналов. Стоит отметить, что ClassA и ClassB ничего не знают друг о друге (то есть они не связаны во время компиляции ).

#include <boost/signal.hpp>
#include <boost/bind.hpp>
#include <iostream>

using namespace boost;
using namespace std;

struct ClassA
{
    signal<void ()>    SigA;
    signal<void (int)> SigB;
};

struct ClassB
{
    void PrintFoo()      { cout << "Foo" << endl; }
    void PrintInt(int i) { cout << "Bar: " << i << endl; }
};

int main()
{
    ClassA a;
    ClassB b, b2;

    a.SigA.connect(bind(&ClassB::PrintFoo, &b));
    a.SigB.connect(bind(&ClassB::PrintInt, &b,  _1));
    a.SigB.connect(bind(&ClassB::PrintInt, &b2, _1));

    a.SigA();
    a.SigB(4);
}

Вывод: [1242 Для краткости я взял несколько ярлыков, которые вы бы не обычно не используется в производственном коде (в частности, контроль доступа слабый, и вы обычно «скрываете» свою регистрацию сигнала за функцией, как в примере с KeithB).

Кажется, что большинство трудностей в boost :: signal заключается в том, чтобы привыкнуть к использованию boost :: bind . Сначала - это немного ошеломляюще! Для более хитрого примера вы также можете использовать bind , чтобы соединить ClassA :: SigA с ClassB :: PrintInt , хотя SigA делает not испускать int :

a.SigA.connect(bind(&ClassB::PrintInt, &b, 10));

Надеюсь, это поможет!

сигнал привыкает к использованию boost :: bind . Сначала - это немного ошеломляюще! Для более хитрого примера вы также можете использовать bind , чтобы соединить ClassA :: SigA с ClassB :: PrintInt , хотя SigA делает not испускать int :

a.SigA.connect(bind(&ClassB::PrintInt, &b, 10));

Надеюсь, это поможет!

сигнал привыкает к использованию boost :: bind . Сначала - это немного ошеломляюще! Для более хитрого примера вы также можете использовать bind , чтобы соединить ClassA :: SigA с ClassB :: PrintInt , хотя SigA делает not испускать int :

a.SigA.connect(bind(&ClassB::PrintInt, &b, 10));

Надеюсь, это поможет!

86
ответ дан 26 November 2019 в 17:21
поделиться
6
ответ дан 26 November 2019 в 17:21
поделиться

Вот пример из нашей кодовой базы. Он был упрощен, поэтому я не гарантирую, что он скомпилируется, но он должен быть близок. Распределение - это ваш класс A, а Slot1 - это ваш класс B. У нас есть несколько таких слотов, каждый из которых подписывается на различное подмножество сигналов. Преимущества использования этой схемы в том, что Sublocation ничего не знает ни о одном из слотов, и слоты не должны быть частью какой-либо иерархии наследования, а должны реализовывать функциональность только для тех слотов, которые им нужны. Мы используем это для добавления пользовательских функций в нашу систему с очень простым интерфейсом.

Sublocation.h

class Sublocation 
{
public:
  typedef boost::signal<void (Time, Time)> ContactSignal;
  typedef boost::signal<void ()> EndOfSimSignal;

  void endOfSim();
  void addPerson(Time t, Interactor::Ptr i);

  Connection addSignalContact(const ContactSignal::slot_type& slot) const;
  Connection addSignalEndOfSim(const EndOfSimSignal::slot_type& slot) const;    
private:
  mutable ContactSignal fSigContact;
  mutable EndOfSimSignal fSigEndOfSim;
};

Sublocation.C

void Sublocation::endOfSim()
{
  fSigEndOfSim();
}

Sublocation::Connection Sublocation::addSignalContact(const ContactSignal::slot_type& slot) const
{
  return fSigContact.connect(slot);
}

Sublocation::Connection Sublocation::addSignalEndOfSim(const EndOfSimSignal::slot_type& slot) const
{
  return fSigEndOfSim.connect(slot);
}

Sublocation::Sublocation()
{
  Slot1* slot1 = new Slot1(*this);
  Slot2* slot2 = new Slot2(*this);
}

void Sublocation::addPerson(Time t, Interactor::Ptr i)
{
  // compute t1
  fSigOnContact(t, t1);
  // ...
}

Slot1.h

class Slot1
{
public:
  Slot1(const Sublocation& subloc);

  void onContact(Time t1, Time t2);
  void onEndOfSim();
private:
  const Sublocation& fSubloc;
};

Slot1.C

Slot1::Slot1(const Sublocation& subloc)
 : fSubloc(subloc)
{
  subloc.addSignalContact(boost::bind(&Slot1::onContact, this, _1, _2));
  subloc.addSignalEndSim(boost::bind(&Slot1::onEndSim, this));
}


void Slot1::onEndOfSim()
{
  // ...
}

void Slot1::onContact(Time lastUpdate, Time t)
{
  // ...
}
11
ответ дан 26 November 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: