我正在尝试编写一些可以在单独的线程中执行类成员函数的代码,但是在线程执行之前和之后添加了一些用于检查赔率和结束的代码。
为此,我在VS2012中使用了c ++ 11的std :: bind和std :: thread功能。
如果我修复了类成员函数可以具有的参数,那么这一切都很有效。 void *,但如果我尝试模板化,我会收到错误。
代码概述
我有一个包含两个函数的简单类,它将在一个线程中执行。他们的论点和名称不同。
我正在创建的类有一个模板化的构造函数和一个函数,它执行前一个类的函数,但是如果线程完成/没有完成,则能够执行它自己的检查/通知。
最后,主要功能只是测试代码。
守则
包含部分:
#include <iostream>
#include <memory>
#include <thread>
#include <functional>
using namespace std;
要执行的类:
class k1
{
public:
k1( int nVal = 0 ) : _val(nVal){};
~k1(){};
void doFunc( void * pParam ){
cout << "Val in class = " << _val << ", param = " << pParam << "\n";
}
void doFunc2( float pParam ){
cout << "Val in class = " << _val << ", param = " << pParam << "\n";
}
int _val;
};
typedef shared_ptr<k1> PK;
线程处理类
class H
{
public:
void controlFunction( std::function<void(void)> callRef ){
cout << "Before calling\n";
callRef();
cout << "After calling\n";
}
template<class T, typename ParamType> // Constructor for any type of class function - void * parameter as only input
H( void(T::* pFunction)(ParamType *), T * pClass, ParamType pParam ){
std::function<void(void)> _call = std::bind( pFunction, pClass, pParam );
_thread = shared_ptr<std::thread>( new thread( &H::controlFunction, this, _call ));
}
~H( void ){
_thread->join();
}
shared_ptr<thread> _thread;
};
typedef shared_ptr<H> PH;
主要功能:
int main(int argc, char* argv[])
{
PK k = make_shared<k1>( 12 );
int i1 = 2;
float f1 = 1.0f;
PH p = PH( new H(&k1::doFunc, k.get(), &i1 ));
PH p2 = PH( new H(&k1::doFunc2, k.get(), f1 ));
return 0;
}
出现的错误是:
错误C2660:'H :: H':函数不带3个参数
提前致谢!
/亨里克
答案 0 :(得分:0)
我猜测您在创建H
对象并以k1::doFunc2
为参数的第二行上收到错误。错误的可能原因是因为k1::doFunc2
没有为参数指针,而H
构造函数中的成员函数指针参数需要它。
当您声明p
变量时,第一行也存在一些问题。这是因为ParamType
模板类型可以推断为 int
或 int*
。原因是因为成员函数指针有ParamType *
,而构造函数的第三个参数使用非指针ParamType
,但你在这里传递一个指针(&i1
)。