Вызов метода по указателю с переменным числом параметров

Тема в разделе "LANGS.C", создана пользователем _220, 11 окт 2010.

  1. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Вот такая задача. Есть список указателей (на методы). Для каждого есть список параметров и их типов. На этапе компиляции ничего не известно. Собственно вопрос, можно ли средствами с++ записать вызов метода (фактически функции) по указателю с переменным числом аргументов без использования _asm (напушит-то в стек можно, но типы будут не всегда тривиальными, и хотелось бы избежать этого источника ошибок)
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Эллипсис же. К примеру - void (*foo)(...);
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Booster, как ты узнаешь тип переменных внутри foo?
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    W4FhLF
    Передавать дескрипшн, хоть первым аргументом, хоть ещё как.
     
  5. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    ИМХО фиговое решение, лучше уж тогда заюзать шаблоны и boost.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    W4FhLF
    Так сказано, на этапе компиляции нечего не известно.
     
  7. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Хм, ну я то понял немного иначе.

    Автор, уточни, что конкретно известно на этапе компиляции и в каком виде хранится эта инфа:

     
  8. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    На этапе компиляции не известно НИ_ЧЕ_ГО.
    В упрощенном варианте схема выглядит так:
    После запуска проги я подгружаю либу и получаю из нее объект (указатель) и указатель на нужный метод.
    Из xml поднимаю информацию (в ЛЮБОМ разумном формате, какой понадобится) о параметрах.
    Вот теперь у меня есть указатель на фкнкцию и аргументы с их типами. Нужно как-то вызвать метод. На ум приходит только switch(число_аргументов) и шаблонами как-то написать случаи от 1 до, скажем, 8 аргументов.
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Насколько я понял "ничего которое неизвестно на этапе компиляции" это сам список указателей, а таблица соответствия метод - список типов параметров известны. Тогда это типичная ситуация технологии COM, по аналогии с которой и надо делать.
     
  10. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    В самом деле, ситуация похожа на COM, только я использую ICE
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Эллипсис.
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    _220
    Хм т.е. ты хочешь информацию о типах подгружать из xml непосредственно при работе программы, но при этом чтобы _компилятор_ предупреждал тебя об их возможном несоответствии :)) В COM это решается тем, что у каждого интерфейса свой заголовочный файл, а на этапе работы программы остаётся только уточнить поддерживает ли либа этот интерфейс под который скомпилена прога (или одна из ветвей проги, если она рассчитана на работу с разными версиями).
     
  13. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Нет, мне не нужно, чтобы компилято меня "предупреждал". Достаточно того, чтобы прога нормально компилилась под различные архитектуры без камасутры с ассемблером.
     
  14. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    _220
    Количество типов конечно и они твоей программе известны? Или могут существовать вообще неизвестные твоей программе типы?
     
  15. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Типы известны, неизвестно только число параметров (ну да, напимать НИ_ЧЕ_ГО было не совсем правильно)
     
  16. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Как это число параметров неизвестно? Когда ты считал эти параметры из файла, у тебя должны быть:

    1. Указатель на объект
    2. Указатель на метод объекта.
    3. Массив void* указателей на параметры.
    4. Их количество.

    Разве нет?
     
  17. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    число параметров на этапе компиляции не известно. На этапе выполнения известно все, что нужно. Нужно просто как-то записать в приемлемой форме вызов по узвтелю с переменным числом аргументов
     
  18. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    _220

    можно посмотреть в сторону
    std::tr1::function
    std::tr1::bind
    и шаблоны
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    RedLord
    Чем тут помогут шабоны, если инфы о типах на этапе компиляции нет?
     
  20. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Вообще, в текущей постановке задачи все решения либо непереносимые, либо негибкие.

    Ну можно, например, предположить, что параметры всех типов имеют один размер, тогда просто создаёте несколько функций с разным количеством параметров (можно вручную, можно через boost::function+boost::bind) одинакового типа фиксированного размера, кладёте их адреса в массив по порядку, этапе выполнения просто вызываете функцию порядковый номер которой совпадает с количеством параметров. Соответственно все параметры приводите к одному типу, внутри метод уже сам разбирается. Если немного поработать с #ifdef такое даже будет работать на обеих x32-64 архитектурах.

    Не знаю, что за проект, но налицо неудачная архитектура. Если это ваш проект, то имеет смысл задуматься и немного переписать его, наложить определённые требования на callback и объекты.