Форум программистов, компьютерный форум CyberForum.ru

Перенаправление указателя при перегрузке оператора в variadic template - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Голосовое управление. Активация записи http://www.cyberforum.ru/cpp/thread1424001.html
Здравствуйте! Хочу добавить в свой проект умного дома голосовое управление. Нужно несколько команд - включить свет/выключить свет/открыть жалюзи и т.д. С распознаванием команды проблем быть не должно, распознавать можно через гугл или яндекс. Вопрос в том, как активировать распознавание? У меня пока что только такая мысль: при появлении звука в микрофоне записывать его, а после окончания...
C++ RAW сокет нужен рабочий пример создания сырого сокета З.ы под windows Добавлено через 20 минут нашел такой код, под хрюшей работает збс, но в 7 неработает, как можно это исправить? и можно ли это исправить вообще? #include <Winsock2.h>//Ws2_32.lib #include <ws2tcpip.h> //#include <Windows.h> #include <iostream.h> http://www.cyberforum.ru/cpp/thread1423999.html
Молодой поэт и программирование C++
Всем доброго времени суток!!!! Я на форуме первый день надеюсь, что мне помогут или дадут хороший совет. Мне надо написать программу или что-то вроде нее, которая решает мою проблему. Я почти всю свою жизнь пишу стихи. Но стихи эти непростые. Они написаны строчными буквами и без знаков препинания(нет ни точек, ни тире,ни запятых). Когда я печатаю текст то пишу сначала как надо для читателя, а...
ГОСТ для C++ C++
Ребят как правильно оформлять код программы, по какому госту?!
C++ Настройка Oracle Solaris Studio под Windows http://www.cyberforum.ru/cpp/thread1421315.html
скачал Oracle Solaris Studio но похоже она только для Solaris, OpenSolaris, Linux - есть ли возможность её Microsoft Windows ?
C++ Построить таблицу, содержащую проценты голосов, отданных командам Помогите пожалуйста, не могу запустить. Выбивает постоянно ошибку при запуске и не могу понять почему. Вот условие: В спортивных соревнованиях участвуют n команд. В файле SPORT содержатся прогнозы результатов соревнований. Каждый прогноз включает номер команды, занявшей первое место, номер команды, занявшей последнее место, номера команд, входящих в первую тройку сильнейших команд.... подробнее

Показать сообщение отдельно
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,007
02.05.2015, 17:44
Izual, не очень понятно что ты хочешь.
Но сразу скажу что сделать нельзя. Нельзя динамически, имея только указатель на функцию, узнать каким именно образом она возвращает данные. Через регистры общего назначения, FPU или еще как. Это можно сделать, только заранее зная прототип этой функции и правильную конвенцию вызова. И это касается не только С++ .
Цитата Сообщение от Izual Посмотреть сообщение
В общем, используя ассемблер можно ли подменить тип возврата? Или может можно извлечь "не правильно скомпанованные данные" и поменять что то(в каких то регистрах) местами по нужной конструкции double, и будет как надо?...
Я так понимаю это вот к этому вопрос:
Цитата Сообщение от Izual Посмотреть сообщение
У меня же из функции должен выйти тип, соотв. например числу.
Если так, то в целом это можно сделать. Даже без ассемблера.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename ...Args>
variant<int, double, float, char> call(int retType, Args... args)
{
    switch(retType)
    {
    case 1:
         return call_impl<int>(args...); // ставится в соответствие статический тип возврата и число
         // call_impl имеет реализацию как в первом твоем посте (функция call)
    case 2:
         return call_impl<double>(args...);
    // и т.д.
    }
}
Вообще, вся эта твоя задача дробится на две отдельные, сложные задачи. Первая задача - написать вариантный тип. В принципе реализации такие уже есть. Но в целом можно конечно сделать и свой. Эта задача целиком и полностью решается в рамках языка С++. Вариантов решения есть два, полиморфная реализация и шаблонная реализация. Примеры: boost::any и boost::variant.
Вторая задача, еще более сложная. Нужно сделать так, чтобы на основе информации времени исполнения, сохраненной в нашем вариантном типе (это информация о том, какой там тип на самом деле), сгенерировался правильный вызов некой процедуры. От процедуры у нас есть только адрес, ну и конвенция вызова (если это вызовы win api, то она известна и едина для всех них). Вот это решить средствами С++ на 100% нельзя. И код, который будет осуществлять вызов нашей процедуры придется генерировать динамически прямо в памяти, а потом отдавать ему управление. Естественно, если процедура на самом деле имеет другие параметры или другую конвенцию вызова, мы, при таком подходе, становимся никак не защищены от падений и других спецэффектов. Т.е. все на наш страх и риск. Т.е. вторая задача потребует от тебя написать маленький компилятор внутри своей программы, который будет прямо в памяти делать код для вызова исходя из динамической информации о типе, сохраненном в variant.
Есть готовые реализации таких вещей, у некоторых компиляторов есть api для JIT генерации кода, есть еще вот такая библиотека. Но если ты все-таки собрался все-все делать сам, приготовься к тому, что изучать придется очень много, и поверхностным ознакомлением не обойтись.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru