Ich habe eine ThreadPool
Klasse mit einer enqueue
Funktion:C++ template - variadische Vorlagen & vorbei konstante Referenz
class ThreadPool
{
public:
//(Code removed here)
template <typename ... Args, typename Fun>
JobId enqueue(Fun func, Args ... args);
//(Code removed here)
}
Und ich benutze es auf dieser nicht statische Memberfunktion loadStuff
auf Klasse Object
:
class Object
{
//(Code removed here)
void init(const PrepareData & prepareData);
virtual bool loadStuff(const PrepareData & prepareData);
//(Code removed here)
}
von in QObject :: init Aufruf:
void QObject::init(const PrepareData &prepareData)
{
threadPool->enqueue(&loadStuff, this, prepareData);
}
Aber ich habe bemerkt, dass prepareData von copy übergeben wurde, was bedeutendes Gedächtnis verschlingt und das Programm signifikant verlangsamt (und nutzlos ist).
Also löschte ich die Kopie ctor und Zuweisungsoperator in PrepareData. Das Programm kompiliert nicht mehr, da die Variadic-Vorlage ihre Parameter nach Wert und nicht nach Referenz bezieht. So
ich erklärte enqueue die variadische Vorlage Argumente Referenz zu übergeben:
template <typename ... Args, typename Fun>
JobId enqueue(Fun func, Args&... args);
Nun ist der Copykonstruktor nicht mehr genannt wird, aber ich bekomme die folgende Fehlermeldung:
object.cpp:21: error: no matching function for call to
'ThreadPool::enqueue(bool (Object::*)(const PrepareData&), Object *, const PrepareData&)' threadPool->enqueue(&prepareType, this, loadStuff);
Also ich Ich bin ziemlich verloren, wie das geht. Ich könnte, anstatt eine const PrepareData &
zu übergeben, eine const PrepareData *
Kopie übergeben, aber ich würde gerne verstehen, warum es nicht mit einer const Referenz funktioniert.
sagen 'Args && ...'. –