Похоже, у вас есть строка, которая была закодирована как 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'
Приведенный ниже код является минимальным рабочим примером того, что вы запросили. 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));
Надеюсь, это поможет!
Вот пример из нашей кодовой базы. Он был упрощен, поэтому я не гарантирую, что он скомпилируется, но он должен быть близок. Распределение - это ваш класс 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)
{
// ...
}