Шаблон класса Cntm::SignatureArgsCollector< DeriveClassT, ResT, SignatureInfoT, ArgsCountI >
Подробное описание
template<typename DeriveClassT, typename ResT, typename SignatureInfoT, int ArgsCountI>
class Cntm::SignatureArgsCollector< DeriveClassT, ResT, SignatureInfoT, ArgsCountI >
Данный модуль предоставляет средства для сборки аргументов вызова в единую структуру (структура Cntm::SignatureInfo::Args, которая будет содержать копии значений всех аргументов, переданных при вызове) для последующей обработки.
Эта операция проводится с помощью объекта - функтора, для которого определен оператор operator(). Этот оператор принимает аргументы, упаковывает их в общую структуру Cntm::SignatureInfo::Args (т.е. копирует значения аргументов в эту структуру) и вызывает процедуры обработки.
Для того, чтобы класс обладал такой функциональностью он должен унаследовать клвсс Cntm::SignatureArgsCollector. Данный класс является шаблоном. В качестве параметров шаблона указывается:
- DeriveClassT - класс, который будет наследовать этот класс;
- ResT - тип возвращаемого operator() значения;
- SignatureInfoT - информация о сигнатуре operator() (возвращаемое значение задается отдельно в ResT);
- ArgsCountI - кол-во аргументов.
Далее, производный класс должен определить у себя следующие эл-ты:
- класс с именем SignatureArgsCollectObject, содержащий метод void* ArgsBuffer(), возвращающий указатель на буфер, в котором следует разместить набор аргументов Cntm::SignatureInfo::Args с помощью оператора new с указанием места размещения и метод ConstructArgs(), который оповещает класс, что аргументы инициализированы. Объект этого класса олицетворяет факт вызова operator(). В качестве базового для этого класса можно использовать Cntm::SignatureCollectObjectBase (см. описание этого класса);
- метод SignatureArgsCollectObject* CreateCollectObject(), создающий объект класса SignatureArgsCollectObject и возвращающий указатель на него. Если в процессе инициализации аргументов после вызова CreateCollectObject(), но до ProcessCollectObject() произойдет исключение, то созданный объект SignatureArgsCollectObject будет автоматически уничтожен оператором delete, а вызов метода ProcessCollectObject() произведен не будет;
- метод ResT ProcessCollectObject(SignatureArgsCollectObject* Object), принимающий SignatureArgsCollectObject с заполненными параметрами, производящий обработку полученных параметров и возвращающий результат оператора (). Данный метод должен отвечать за уничтожение объекта SignatureArgsCollectObject, в т.ч. и при исключениях;
- метод bool NoNeedCreateCollectObject(), определяющий нужно ли создавать объект класса SignatureArgsCollectObject и выполнять его обработку. Если данный метод вернет true, то будет вызван метод NoneProcessCollectObject для возврата значения по умолчанию, если false, то произойдет нормальная обработка вызова с помощью 2 вышеуказанных методов;
- метод ResT NoneProcessCollectObject(), возвращающий значение по умолчанию, когда обработка вызова не требуется.
Такой наследующий класс может выглядеть следующим образом: template < typename SignatureT > class Class1: public Cntm::SignatureArgsCollector < Class1 < SignatureT > , void, Cntm::SignatureInfo <SignatureT>, Cntm::SignatureInfo <SignatureT> :: argsCount > { private: friend class Cntm::SignatureArgsCollector< Class1 < SignatureT > , void, Cntm::SignatureInfo <SignatureT>, Cntm::SignatureInfo <SignatureT> :: argsCount >; typedef SignatureArgsCollectObjectBase<typename Cntm::SignatureInfo <SignatureT>Args> SignatureArgsCollectObject; SignatureCollectObject* CreateCollectObject() { return new SignatureCollectObject; } void ProcessCollectObject(SignatureCollectObject* Object) { cout << "ProcessCollectObject " << SignInfoType::argsCount << endl; } bool NoNeedCreateCollectObject() { return false; } void ProcessCollectObject(SignatureCollectObject* Object) {} };
См. определение в файле SignatureArgsCollector.h строка 59
Объявления и описания членов класса находятся в файле:
|
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой
1.5.3
|