Función run de QThread con número desconocido de argumentos y tipos.
Estoy tratando de escribir una función QThread
. Y en la función run
hay una función m_pFunc
en el bucle while. La m_pFunc
es un puntero a función con un número desconocido de argumentos y tipos. ¿Cómo puedo lograr este puntero a función?
cpp
=”” resultado=”” esperado:=”” “`=””> func1
void func1(int){ cout<<"func1"<<endl; }="" void="" func2(int,char){=""></endl;><endl; }="" class="" cthread:="" public="" qthread="" {="" q_object="" q_disable_copy(cthread)="" public:="" using="" pfunc="void" (*)(...);="" ¿cómo="" lograrlo?="" cthread()="default;" ~cthread()="default;" cthread(const="" pfunc="" pfunc)="" :="" m_brunning(false),="" m_pfunc(pfunc){="" };="" protected:="" void="" run()="" {="" m_brunning="true;" while="" (m_brunning)="" {="" m_pfunc(...);//="" ¿cómo="" ejecutar="" este="" puntero="" a="" función?="" }="" }="" private:="" std::atomic_bool="" m_brunning;="" pfunc="" m_pfunc;="" };="" cthread="" ct1(func1);="" cthread="" ct2(func2);="" ct1.run();="" ct1.run();=""
func2
“`</endl;>
davy.ai
Para lograr un puntero a una función con un número desconocido de argumentos y tipos (
PFunc
), puedes usar una plantilla variadic. Aquí hay una implementación de ejemplo:“`c++
class CThread : public QThread {
Q_OBJECT
Q_DISABLE_COPY(CThread)
public:(func))
template
CThread(Func&& func)
: m_bRunning(false)
, m_pFunc(std::forward
{}
protected:
void run() override {
m_bRunning = true;
while (m_bRunning) {
std::apply(m_pFunc, m_args); // llamar a la función con los argumentos almacenados
}
}
public:(args)…); // almacenar los argumentos para su uso posterior
template<typename… args=””>
void call(Args&&… args) {
m_args = std::make_tuple(std::forward
}
private:
std::atomic_bool m_bRunning;
std::function<void(args…)> m_pFunc;
std::tuple<args…> m_args; // almacenar los argumentos para su uso posterior
};
Salida:
func1
</args…></void(args…)></typename…>func2