In meiner App möchte ich ein Parameterpaket über eine Legacy-Funktionssignatur übergeben und die Werte ändern. Hier ist Code, der meine Frage mit meinen Versuchen als Kommentare zeigt:Übergabe eines Parameterpakets über eine Legacy-Funktionssignatur mit forward_as_tuple
#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;
}
Gibt es eine Möglichkeit die Parameter packen einen deklarierbaren lvalue zu machen?
Als eine Vermutung, sie wollen, dass Sie einen Rückruf weitergeben. Der Rückruf nimmt ein "void *" und einige andere Argumente, die sie zur Verfügung stellen. Sie möchten einige Daten durch das 'void *' übergeben, damit es am anderen Ende an Sie zurückgegeben wird. Sie speichern Ihren Callback oder Ihre 'void *' nicht länger als einen festen Bereich, den Sie kontrollieren können. Ist das richtig? Frage: Wird der 'void *' als erster oder letzter Parameter an die Callback-Funktion übergeben? – Yakk
Die Verwendung von 'void *' war lediglich mein Versuch, die eigentliche Signatur als einen neutralen Typ für die Diskussion darzustellen. Tatsächlich ist der eigentliche Signaturparameter das ehrwürdige 'LPARAM', das ein' long' ist. Wie MS angibt, sind sowohl "WPARAM" als auch "LPARAM" "Typen, die zum Übergeben und Zurückgeben von polymorphen Werten verwendet werden". Daher werden in meiner Frage keine Rückrufe übergeben oder aufgerufen. Mein Interesse liegt direkt in einem besseren Verständnis darüber, wie man eine beliebige Anzahl von Argumenten über ein solches Legacy-Konstrukt weiterleitet, wobei diese Parameter wertveränderbare Referenzen in einem intelligenten Zeiger sind. – rtischer8277
FYI, ich löste das Problem von Callbacks über Legacy-Signaturen mit 'future'. Siehe StackOverflow-Problem [Wie kann ich shared_ptr mit PostThreadMessage verwenden?] (Http://stackoverflow.com/questions/25667226) und nach der Antwort suchen, die mit beginnt * @ Remy Lebeau und @ rtischer8277 haben bisher zwei Antworten zu meinem ursprünglichen Beitrag eingereicht ... *. – rtischer8277