Grey304
> Частичное применение бы.. Хотя бы для первого параметра функции.
ды можно, но будет очень много кописпасты, как с макросами для делегатов но больше в несколько раз. с вариадиками было бы проще, но вот договорились не юзать их.
интересно что делать, если надо будет забиндить функцию void foo()?
EnkiduTI
> интересно что делать, если надо будет забиндить функцию void foo()?
Delegate< void() > lv_Delegate
Chaos_Optima
> lv_Delegate
auto MyCreateThead=CreateThead(CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION)( n*ln( n)) MyCreateThead( lpStartAddress, lpParameter, dwCreationFlags, &lpThreadId); //Boost, C++11: auto MyCreateThead1=boost::bind( CreateThead, CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION, n*ln( n), _1, _2, _3, _4); MyCreateThead1( lpStartAddress, lpParameter, dwCreationFlags, &lpThreadId);
Было бы конечно приятно, хоть и не так оптимально как в бусте, зато не так вырвиглазо и иногда многословно.
И ещё интересно, boost::make_function когда-нибудь появится? Хотя в большинстве случаев вывести сигнатуру он не сможет.
Kartonagnick
От тебя делагатов ждать?
Chaos_Optima
> От тебя делагатов ждать?
Да.
Kartonagnick
Где же твои делегаты?
Kartonagnick
прошло уже 4 дня 2 из которых выходные + не законченный этот выходной. (( ты меня печалишь
Chaos_Optima
> > От тебя делагатов ждать?
> Да.
Он предложил вам ждать, но не сказал, что планирует сделать делегаты. Так что продолжайте ждать до исхода дней.
Кстати, а в чем спор? Он с помошью своих коннекторов делает делегаты, а вы с помошью своих рук? Если так, то это объяснило бы задержку. (:
laMer007
> Кстати, а в чем спор?
он утверждает что сделает обобщённые делегаты без применения шаблонов, ну точнее пользователю этих делегатов не придётся по средству шаблонов указывать сигнатуру, и утверждает что это будет удобнее нежели делегаты на подобии std::function. И мы договорились, я пишу подобие std::function он пишет свои делегаты, оба пишем по 2003 стандарту, из библ разрешено применять только STL. В комплект должны походить примеры использования.
Мои делегаты обеспечивают единую сигнатуру вызова, при этом к моим делегатам можно привязать как обычные функции, так и методы, и функторы, также мои делегаты обеспечивают отсутствие лишнего копирования при передаче аргументов )) наверно сейчас обновлю версию, добавлю дополнительное поведения для классов унаследованных от SafeDelegate
Kartonagnick
Гдеже твои делегаты ужо столько времени прошло, засчитываем слив?
Chaos_Optima
> Chaos_Optima
я тут запустил кое как твои делегаты, VS2005. Проект не смог открыть, но думаю это из-за того что ты в более поздней студии делал. Подключил ручками, вываливает куча ошибок смысл которых в след
в файле Delegate.h
#pragma once namespace Functions { template<class sign> class Delegate; #define T_ARGS #define ARGS #define D_ARGS #define V_ARGS #include "Delegate.spec.h" #undef T_ARGS #undef ARGS #undef D_ARGS #undef V_ARGS
инклюдят Delegate.spec.h, а там
#include "Type.h" namespace Functions {
тот же namespace, пришлось каментить, если даже так задумано, то как то не логично, были бы где нить в detail
как ток разобрался с этим, интересно было запустить Функцию которая принимает в себя указатель на функцию
void foo(void ( * fptr ) ) { }
заглохло наглухо при компиляции
typedef void (* fptr )( ); Delegate< void ( fptr ) > lv_Error = &foo;
думаю для функций мемберов будет тоже самое
Также захотелось посмотреть как будет ругаться при бинде какого нить __fastcall
void __fastcall foo2() { }
не компилит
Delegate< void () > lv_Error2 = &foo2;
ну лан, это хоть ожидаемо, хотя смотря на код, гладко подархитектурить это не понятно как, либо переорганизовывать всю кухню... либо хз как
Но самый эпик файл я получил в след примере, из-за чего собственно и захотелось посмотреть, особенно после слов
Chaos_Optima
> также мои делегаты обеспечивают отсутствие лишнего копирования при передаче
> аргументов
создал класс, тупо смотреть сколько там у тебя промежуточных копирований :)
struct Nail { int * ptr; ~Nail() { delete [] ptr; ptr = NULL; cout << "dctor" << std::endl; } Nail( ) : ptr( new int[ 1024 ] ) { cout << "default ctor" << std::endl; } Nail( const Nail & rhs) : ptr( new int [ 1024 ] ) { cout << "copy ctor" << std::endl; } Nail & operator = ( const Nail & rhs ) { if( this != & rhs ) { ptr = new int [ 1024 ]; cout << "operator =" << std::endl; } return * this; } };
создал функцию "заразу"
void bar(Nail n ) { cout << "bar" << std::endl; }
далее где то в коде объявил делегата
Delegate< void (Nail ) > lv_Error = &bar;
далее запустил
Nail n; lv_Error(n );
вывод в консоль
default ctor
copy ctor
copy ctor
copy ctor
bar
dctor
dctor
dctor
dctor
омг! :)
да, через typedef сигнатуру не отлавливает, надо ему подавать без *
типо typedef void ( fptr_type * )(), привередливый :)
EnkiduTI
> я тут запустил кое как твои делегаты, VS2005. Проект не смог открыть, но думаю
> это из-за того что ты в более поздней студии делал. Подключил ручками,
> вываливает куча ошибок смысл которых в след
в 2008 делал
EnkiduTI
> создал класс, тупо смотреть сколько там у тебя промежуточных копирований :)
да там проблема в том что размер класса должен превышать 8 байт, иначе передаётся по значению просто нехотелось заморачиватся и выписывать стандартные значения )) поправлю.
EnkiduTI
> типо typedef void ( fptr_type * )(), привередливый :)
есесено ))
ок сёня поправлю и залью уже в более нормальном виде
пасиб за отзыв.
Chaos_Optima
> да там проблема в том что размер класса должен превышать 8 байт, иначе
> передаётся по значению просто нехотелось заморачиватся и выписывать стандартные
> значения )) поправлю.
угу, я это видел :) чтобы это норм подправить надо почти весь type_traits переписать
а объекты могут еще возвращаться! я не смотрел, что там происходит, но судя из логики общей, он его обернет в ссылку если он будет более 8 байт ? и будет ругаться на возврат ссылки локального объекта ?
Вот чтобы это норм заработало, должен быть свой плейс холдер, который не определяет что надо по функциям передавать, а что надо использовать для локальной передачи нуждами имплементации делегата, тогда промежуточных копирований не будет. А когда появиться такой вот плейсхолдер, то окажется что его можно сувать в разном порядке, тоесть появиться бустовский маджик
Тема в архиве.