Когда приемлемо использовать void* в С++ библиотеке?
От: Misha87  
Дата: 24.12.08 11:15
Оценка:
Пишу С++ библиотеку классов. Архитектура вроде гибкая и красивая. Но есть один тонкий момент — когда пользователь должен задать CallBack функцию, но её вид заранее мне, как автору библиотеки, неивестен. Я хочу чтобы пользователь задвал этот вид и устанавливал сам коллбек через функицю типа

bool SetCallback("int", "float, char*, int, long", void*)


Первый аргумент — это тип возвращаемого значения
Второй — типы аргументов
Третий — сама функция.

Ума не приложу — как это красиво сделать без того, чтобы дать пользовтаелю кучу шаблонов на все возможные случаи жизни (ну то есть на функции с одним агрументом, с двумя, с тремя....)

Какой-то универсальный тип коллбеков типа как в LUA функция с lua_State в агрументе — такое не предлагать, я как раз от этого хочу уйти

Спасибо
Re: Когда приемлемо использовать void* в С++ библиотеке?
От: Sergey Россия  
Дата: 24.12.08 11:25
Оценка:
"Misha87" <47313@users.rsdn.ru> wrote in message news:3226994@news.rsdn.ru...
> Пишу С++ библиотеку классов. Архитектура вроде гибкая и красивая. Но есть один тонкий момент — когда пользователь должен задать CallBack функцию, но её вид заранее мне, как автору библиотеки, неивестен. Я хочу чтобы пользователь задвал этот вид и устанавливал сам коллбек через функицю типа
>
>
> bool SetCallback("int", "float, char*, int, long", void*)
>

>
> Первый аргумент — это тип возвращаемого значения
> Второй — типы аргументов
> Третий — сама функция.
>
> Ума не приложу — как это красиво сделать без того, чтобы дать пользовтаелю кучу шаблонов на все возможные случаи жизни (ну то есть на функции с одним агрументом, с двумя, с тремя....)

Кто, когда и с какими аргументами будет ее вызывать?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Когда приемлемо использовать void* в С++ библиотеке?
От: Misha87  
Дата: 24.12.08 11:28
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Кто, когда и с какими аргументами будет ее вызывать?


она будет вызываться изнутри пользовательского же скрипта — вот работу сос криптом и обеспечивает библиотека. Грубо говоря пишу свою скриптовую машину, а эта штука — регистарция в скриптовой машине C++ функций
Re: Когда приемлемо использовать void* в С++ библиотеке?
От: -MyXa- Россия  
Дата: 24.12.08 11:33
Оценка:
Здравствуйте, Misha87, Вы писали:

Можно так
Автор: -MyXa-
Дата: 24.12.08
.
Если не поможет, будем действовать током... 600 Вольт (C)
Re[2]: Когда приемлемо использовать void* в С++ библиотеке?
От: Misha87  
Дата: 24.12.08 11:36
Оценка:
Здравствуйте, -MyXa-, Вы писали:

MX>Можно так
Автор: -MyXa-
Дата: 24.12.08
.


Так у меня сейчас примерно так и есть.

Минусы, от которых хочу избавится:
1) писать свой basic_caller для каждого количества агрументов
2) мне кажется void SetFucntion("int", "int, char", fucn) гораздо приятнее и легче в использовании пользователем, чем нагромождение кучи шаблонов — вот от этого я и пытаюсь избавится
Re[3]: Когда приемлемо использовать void* в С++ библиотеке?
От: Sergey Россия  
Дата: 24.12.08 11:45
Оценка: +1
"Misha87" <47313@users.rsdn.ru> wrote in message news:3227029@news.rsdn.ru...

> MX>Можно так
Автор: -MyXa-
Дата: 24.12.08
.

>
> Так у меня сейчас примерно так и есть.
>
> Минусы, от которых хочу избавится:
> 1) писать свой basic_caller для каждого количества агрументов

Его, кстати, можно генерировать с помощью препроцессорных фишек из буста.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Когда приемлемо использовать void* в С++ библиотеке?
От: Sergey Россия  
Дата: 24.12.08 11:45
Оценка:
"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* в С++ библиотеке?
От: Misha87  
Дата: 24.12.08 12:18
Оценка:
Здравствуйте, Sergey, Вы писали:

S>А сами C++ функции тоже пользователь писать будет?


Ну да, это ж его колбеки
Re[4]: Когда приемлемо использовать void* в С++ библиотеке?
От: Misha87  
Дата: 24.12.08 12:20
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Его, кстати, можно генерировать с помощью препроцессорных фишек из буста.


Ну заставлять юзера тащить рядом с моей либой еще и буст — это точно не вариант
Re: Когда приемлемо использовать void* в С++ библиотеке?
От: Аноним  
Дата: 24.12.08 12:30
Оценка: +4
M>Пишу С++ библиотеку классов. Архитектура вроде гибкая и красивая. Но есть один тонкий момент — когда пользователь должен задать CallBack функцию, но её вид заранее мне, как автору библиотеки, неивестен. Я хочу чтобы пользователь задвал этот вид и устанавливал сам коллбек через функицю типа

M>
M>bool SetCallback("int", "float, char*, int, long", void*)
M>

От С++ тут только тип возвращаемого значения, и особой красоты архитектуры на основе этой функции не видно
Re[2]: Когда приемлемо использовать void* в С++ библиотеке?
От: Misha87  
Дата: 24.12.08 12:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>От С++ тут только тип возвращаемого значения, и особой красоты архитектуры на основе этой функции не видно


Ну ругать-то каждый может . Посоветуйте как красиво зарегистрировать в скрипте C++ функцию без использования всяких шаблонов
Re[5]: Когда приемлемо использовать void* в С++ библиотеке?
От: Sergey Россия  
Дата: 24.12.08 12:44
Оценка:
"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* в С++ библиотеке?
От: Misha87  
Дата: 24.12.08 12:49
Оценка:
Здравствуйте, Sergey, Вы писали:

S>...

S> YourScriptLib::RegCallback(&MyCallback);
S>[/ccode]

Так не получается так просто сделать регистраицю с автоматическим выцеплением типов и количесвта аргуметов. Пользователю приходиться указывать все типы — и возвращаемого значенияи типы агруметов
Re[7]: Когда приемлемо использовать void* в С++ библиотеке?
От: Sergey Россия  
Дата: 24.12.08 12:55
Оценка:
"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* в С++ библиотеке?
От: -MyXa- Россия  
Дата: 24.12.08 15:56
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Здравствуйте, Sergey, Вы писали:


S>>...

S>> YourScriptLib::RegCallback(&MyCallback);
S>>[/ccode]

M>Так не получается так просто сделать регистраицю с автоматическим выцеплением типов и количесвта аргуметов. Пользователю приходиться указывать все типы — и возвращаемого значенияи типы агруметов


К сказанному мною выше добавьте:

namespace YourScriptLib
{
std::map<std::string, base_caller*> all_functions;

template<typename T>
void RegCallback(std::string name, T func)
{
all_functions[name] = new basic_caller<boost::remove_pointer<T>::type>(func);
}
}

пользоваться так:

YourScriptLib::RegCallback("foo2", foo2);

Можно и макрос сделать, чтоб имя в кавычках не писать. Но и так хорошо — вдруг Вы будете инстанс шаблона оборачивать.
Если не поможет, будем действовать током... 600 Вольт (C)
Re[7]: Когда приемлемо использовать void* в С++ библиотеке?
От: byleas  
Дата: 24.12.08 20:05
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Так не получается так просто сделать регистраицю с автоматическим выцеплением типов и количесвта аргуметов. Пользователю приходиться указывать все типы — и возвращаемого значенияи типы агруметов

Почему не получается? Как в boost::function не подходит? С дополнением в виде подобия reflection, которая переводит типы аргументов и результата функции в строковое представление и обратно.
Re: Когда приемлемо использовать void* в С++ библиотеке?
От: LaptevVV Россия  
Дата: 25.12.08 14:42
Оценка: +1
Здравствуйте, Misha87, Вы писали:

M>Пишу С++ библиотеку классов. Архитектура вроде гибкая и красивая. Но есть один тонкий момент — когда пользователь должен задать CallBack функцию, но её вид заранее мне, как автору библиотеки, неивестен. Я хочу чтобы пользователь задвал этот вид и устанавливал сам коллбек через функицю типа


M>
M>bool SetCallback("int", "float, char*, int, long", void*)
M>


M>Первый аргумент — это тип возвращаемого значения

M>Второй — типы аргументов
M>Третий — сама функция.

M>Ума не приложу — как это красиво сделать без того, чтобы дать пользовтаелю кучу шаблонов на все возможные случаи жизни (ну то есть на функции с одним агрументом, с двумя, с тремя....)


Я б подумал о том, чтобы вместо функции использовать класс-функтор.
Тогда можно будет в библиотеке определить абстрактный базовый класс с чистой функцией operator()
А использующие библиотеку пусть наследуют и доопределяют собственный класс-функтор.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.