Пишу С++ библиотеку классов. Архитектура вроде гибкая и красивая. Но есть один тонкий момент — когда пользователь должен задать CallBack функцию, но её вид заранее мне, как автору библиотеки, неивестен. Я хочу чтобы пользователь задвал этот вид и устанавливал сам коллбек через функицю типа
Первый аргумент — это тип возвращаемого значения
Второй — типы аргументов
Третий — сама функция.
Ума не приложу — как это красиво сделать без того, чтобы дать пользовтаелю кучу шаблонов на все возможные случаи жизни (ну то есть на функции с одним агрументом, с двумя, с тремя....)
Какой-то универсальный тип коллбеков типа как в LUA функция с lua_State в агрументе — такое не предлагать, я как раз от этого хочу уйти
Спасибо
Re: Когда приемлемо использовать void* в С++ библиотеке?
"Misha87" <47313@users.rsdn.ru> wrote in message news:3226994@news.rsdn.ru... > Пишу С++ библиотеку классов. Архитектура вроде гибкая и красивая. Но есть один тонкий момент — когда пользователь должен задать CallBack функцию, но её вид заранее мне, как автору библиотеки, неивестен. Я хочу чтобы пользователь задвал этот вид и устанавливал сам коллбек через функицю типа > >
> > Первый аргумент — это тип возвращаемого значения > Второй — типы аргументов > Третий — сама функция. > > Ума не приложу — как это красиво сделать без того, чтобы дать пользовтаелю кучу шаблонов на все возможные случаи жизни (ну то есть на функции с одним агрументом, с двумя, с тремя....)
Кто, когда и с какими аргументами будет ее вызывать?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Когда приемлемо использовать void* в С++ библиотеке?
Здравствуйте, Sergey, Вы писали:
S>Кто, когда и с какими аргументами будет ее вызывать?
она будет вызываться изнутри пользовательского же скрипта — вот работу сос криптом и обеспечивает библиотека. Грубо говоря пишу свою скриптовую машину, а эта штука — регистарция в скриптовой машине C++ функций
Re: Когда приемлемо использовать void* в С++ библиотеке?
Минусы, от которых хочу избавится:
1) писать свой basic_caller для каждого количества агрументов
2) мне кажется void SetFucntion("int", "int, char", fucn) гораздо приятнее и легче в использовании пользователем, чем нагромождение кучи шаблонов — вот от этого я и пытаюсь избавится
Re[3]: Когда приемлемо использовать void* в С++ библиотеке?
"Misha87" <47313@users.rsdn.ru> wrote in message news:3227012@news.rsdn.ru...
> S>Кто, когда и с какими аргументами будет ее вызывать? > > она будет вызываться изнутри пользовательского же скрипта — вот работу сос криптом и обеспечивает библиотека. Грубо говоря пишу свою скриптовую машину, а эта штука — регистарция в скриптовой машине C++ функций
А сами C++ функции тоже пользователь писать будет?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Когда приемлемо использовать void* в С++ библиотеке?
M>Пишу С++ библиотеку классов. Архитектура вроде гибкая и красивая. Но есть один тонкий момент — когда пользователь должен задать CallBack функцию, но её вид заранее мне, как автору библиотеки, неивестен. Я хочу чтобы пользователь задвал этот вид и устанавливал сам коллбек через функицю типа
M>
"Misha87" <47313@users.rsdn.ru> wrote in message news:3227106@news.rsdn.ru...
> S>А сами C++ функции тоже пользователь писать будет? > > Ну да, это ж его колбеки
Тогда я честно говоря вообще не понимаю аргументов против шаблонов. Где-то в своем С++ коде юзер напишет
int MyCallback(double x, long y)
{ ... }
...
YourScriptLib::RegCallback(&MyCallback);
Поскольку компилировать ему этот код все равно придется, почему его должно волновать — YourScriptLib::RegCallback шаблонная или нет? Ну а в этот момент можно и типы аргументов из нее выцепить, и все что надо инстанцировать.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Когда приемлемо использовать void* в С++ библиотеке?
Здравствуйте, Sergey, Вы писали:
S>... S> YourScriptLib::RegCallback(&MyCallback); S>[/ccode]
Так не получается так просто сделать регистраицю с автоматическим выцеплением типов и количесвта аргуметов. Пользователю приходиться указывать все типы — и возвращаемого значенияи типы агруметов
Re[7]: Когда приемлемо использовать void* в С++ библиотеке?
"Misha87" <47313@users.rsdn.ru> wrote in message news:3227165@news.rsdn.ru...
> S>... > S> YourScriptLib::RegCallback(&MyCallback); > S>[/ccode] > > Так не получается так просто сделать регистраицю с автоматическим выцеплением типов и количесвта аргуметов. Пользователю приходиться указывать все типы — и возвращаемого значенияи типы агруметов
А с помощью boost::type_traits не получается? Там кода не много, если к себе перетащить потребуется. Хотя, конечно, ручками или там перлом каким под все поддерживаемые количества аргументов код дублировать придется, раз BOOST_PP непримемлем.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[7]: Когда приемлемо использовать void* в С++ библиотеке?
Здравствуйте, Misha87, Вы писали:
M>Здравствуйте, Sergey, Вы писали:
S>>... S>> YourScriptLib::RegCallback(&MyCallback); S>>[/ccode]
M>Так не получается так просто сделать регистраицю с автоматическим выцеплением типов и количесвта аргуметов. Пользователю приходиться указывать все типы — и возвращаемого значенияи типы агруметов
Здравствуйте, Misha87, Вы писали:
M>Так не получается так просто сделать регистраицю с автоматическим выцеплением типов и количесвта аргуметов. Пользователю приходиться указывать все типы — и возвращаемого значенияи типы агруметов
Почему не получается? Как в boost::function не подходит? С дополнением в виде подобия reflection, которая переводит типы аргументов и результата функции в строковое представление и обратно.
Re: Когда приемлемо использовать void* в С++ библиотеке?
Здравствуйте, Misha87, Вы писали:
M>Пишу С++ библиотеку классов. Архитектура вроде гибкая и красивая. Но есть один тонкий момент — когда пользователь должен задать CallBack функцию, но её вид заранее мне, как автору библиотеки, неивестен. Я хочу чтобы пользователь задвал этот вид и устанавливал сам коллбек через функицю типа
M>
M>Первый аргумент — это тип возвращаемого значения M>Второй — типы аргументов M>Третий — сама функция.
M>Ума не приложу — как это красиво сделать без того, чтобы дать пользовтаелю кучу шаблонов на все возможные случаи жизни (ну то есть на функции с одним агрументом, с двумя, с тремя....)
Я б подумал о том, чтобы вместо функции использовать класс-функтор.
Тогда можно будет в библиотеке определить абстрактный базовый класс с чистой функцией operator()
А использующие библиотеку пусть наследуют и доопределяют собственный класс-функтор.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!