В моем приложении я хотел бы передать пакет параметров поверх сигнатуры устаревшей функции и изменить значения. Вот код, который иллюстрирует мой вопрос с моими попытками в качестве комментариев:
#include <tuple>
#include <cassert>
void LegacySignature( void* param );
template< typename... ArgsT >
// using ???; // attempt: can 'template alias' or 'using declaration' make the pack's type visible so I can use it inside the LegacyFunction?
void MyFunc( ArgsT&... args )
{
auto userArgsTuple = std::forward_as_tuple< ArgsT&... >( args... );
LegacySignature( &userArgsTuple );
}
void LegacySignature( void* param )
{
// auto userArgsTuple = reinterpret_cast<???>( param ); // attempt: how can I get the parameter pack's type declared so I can use it here?
// do something with the params like change num to 44 and tf to true;
//userArgsTuple->num = 44; // desired functionality
//userArgsTuple->tf = true; // desired functionality
}
int main()
{
int num { 33 };
bool tf { false };
MyFunc( num, tf );
assert( num == 44 && tf == true );
return 0;
}
Есть ли способ сделать пакет параметров декларируемым lvalue?
void*
и некоторые другие аргументы, которые они предоставляют. Вы хотите передать некоторые данные черезvoid*
, чтобы они были переданы вам на другом конце. Они не будут хранить ваш обратный вызов или вашvoid*
дольше, чем фиксированная область, над которой вы имеете контроль. Это верно? Вопрос:void*
передается в качестве первого или последнего параметра вашей функции обратного вызова? - person Yakk - Adam Nevraumont   schedule 14.12.2016void*
было просто моей попыткой представить фактическую подпись как нейтральный тип для обсуждения. На самом деле фактическим параметром подписи является почтенныйLPARAM
, который являетсяlong
. Как заявляет MS, иWPARAM
, иLPARAM
являются «типами, используемыми для передачи и возврата полиморфных значений». Таким образом, в моем вопросе не передаются и не вызываются обратные вызовы. Мой интерес заключается непосредственно в лучшем понимании того, как пересылать произвольное количество аргументов через такую устаревшую конструкцию, где эти параметры являются ссылками с изменяемым значением в интеллектуальном указателе. - person rtischer8277   schedule 14.12.2016future
См. проблему StackOverflow [Как я могу использовать shared_ptr с помощью PostThreadMessage?]( stackoverflow.com/questions /25667226) и найдите ответ, начинающийся с @Remy Lebeau и @rtischer8277 уже отправили два ответа на мое первоначальное сообщение…. - person rtischer8277   schedule 14.12.2016