我制作了一个使用成员函数数组初始化线程数组的类。
我不知道如何将函数指针传递给线程构造函数。关于该主题的文档很少。
class.h
#define N_FUNCTIONS 23
class TradingData
{
public:
void EXECUTE();
void Book();
void Charts();
void Company();
void Dividends();
void Earnings();
void EffectiveSpread();
void Financials();
void KeyStats();
void LargestTrades();
void List();
void Logo();
void News();
void OHLC();
void Peers();
void Previous();
void Price();
void Quote();
void Relevant();
void Splits();
void TimeSeries();
void VolumeByVenue();
void S_Previous();
void S_Symbols();
private:
std::thread p_thread[N_FUNCTIONS];
typedef void (TradingData::*overall)();
overall p_overall[N_FUNCTIONS] = {
&TradingData::Book,
&TradingData::Charts,
&TradingData::Company,
&TradingData::Dividends,
&TradingData::Earnings,
&TradingData::EffectiveSpread,
&TradingData::Financials,
&TradingData::KeyStats,
&TradingData::LargestTrades,
&TradingData::List,
&TradingData::Logo,
&TradingData::News,
&TradingData::OHLC,
&TradingData::Peers,
&TradingData::Previous,
&TradingData::Price,
&TradingData::Quote,
&TradingData::Relevant,
&TradingData::Splits,
&TradingData::TimeSeries,
&TradingData::VolumeByVenue,
&TradingData::S_Symbols,
&TradingData::S_Previous
};
class.cpp
void TradingData::EXECUTE()
{
for (int i = 0; i < N_FUNCTIONS; i++) {
p_thread[i] = std::thread((this->*p_overall[i])()); //here is the problem
}
for (int i = 0; i < N_FUNCTIONS; i++) {
p_thread[i].join();
}
std::cout << "finished successfully" <<std::endl;
}
下一个错误: 错误C2440'':无法从'void'转换为'std :: thread'
答案 0 :(得分:1)
您应该写电话;
p_thread[i] = std::thread(TradingData::p_overall[i], this);
如果调用成员函数,则类名将包含在调用中。
答案 1 :(得分:0)
p_thread[i] = std::thread((this->*p_overall[i])());
这会将正在调用的成员函数的返回值传递给线程构造函数。但是,由于您没有返回可调用的内容,因此,这当然甚至无法编译。
请注意,您实际上在其上调用成员函数的对象(对您来说是透明的)作为第一个参数传递给被调用的函数。这是创建线程时需要反映的内容:
p_thread[i] = std::thread(p_overall[i], *this);
启动时,线程现在将以*this
作为第一个参数调用成员函数。请注意,尽管函数内部的this
被定义为指针,但实际上成员函数会接受引用,从而取消引用此指针...
有时候,lambda很有用,在这里看起来像这样:
std :: thread t(this,i {(this-> * p_overall [i])();});
当然可以,在给定的情况下过度杀伤,但将来可能会在其他情况下使用...