两天前,我问过关于创建线程来使用Win32应用程序接口运行非静态类方法的问题,我几乎得到了一个解决方案,但有一些问题让我感到困惑,所以我在发布上一个问题的答案之前问了这个问题。
我正在尝试使用这段代码来线程一个返回类型未知的函数:
template <class R, R func() >
unsigned int usualfunc() {
func();
return 1;
}
template <class R>
int Start(R(*func)()) {
typedef decltype(&usualfunc<int, func>) D; // I get the error here , I can't get the address of the template function directly I need this
D p = &usualfunc<R, func>;
uintptr_t add = (uintptr_t)p;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)add, 0, 0, 0);
func();
return 1;
}
int main() {
Start(ltest);
}
当我尝试编译上面的代码时,我得到:
错误3556 'usualfunc':'decltype‘的参数不正确
在MSDN上描述了错误描述:
然而,我在此之前尝试了另一个代码,它工作得很好,但我对语法不是很了解:
template <class R, R func() >
unsigned int usualfunc() {
func();
return 1;
}
template <class R,R func()>
int Start() {
typedef decltype(&usualfunc<int, func>) D; // works well
D p = &usualfunc<R, func>;
uintptr_t add = (uintptr_t)p;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)add, 0, 0, 0);
func();
return 1;
}
int main() {
Start<int,ltest>(); // works
}
我知道这段代码已经足够了,但是我想使用Start(ltest)
而不是Start<int,ltest>()
。
注意:没有人说我应该在usualfunction
中使用函数作为参数,我将它用作模板参数,因为CreateThread()
不能将函数作为参数传递。
发布于 2018-05-29 09:22:41
模板参数在编译时必须是已知的。但是,您尝试使用普通函数参数func
作为模板参数。
在第二段代码中,您给出了一个模板参数作为模板参数,这很好。
您的第一个代码是错误的,原因与下面的代码类似:
template<int X> void f() { }
int main(int argc, char **argv) { f<argc>(); }
尽管错误消息比较模糊。
由于C++17,您可以通过对第二个代码进行以下修改来获得所需的语法:
template <auto func>
int Start() {
using R = decltype(func());
// proceed as before...
把它叫做Start<ltest>();
。
在使用C++17之前,您可以在第二个代码中使用宏:
#define START(func) Start<decltype(func()), func>
发布于 2018-05-29 17:25:54
因为我使用的是visual studio 2015,不能使用自动模板,所以我使用了M.M所说的宏,并以此结束
Thread t;
t.SetFunc(ltest);
t.SetMember(testt, testf, tt); // class type , member function , pointer to class , it's like this : testt::testf , I can use this outside of class
t.SetMember(testt, testf, this); // from a member of the class , this is a pointer to the class , as I use this inside the member I can also thread private members here
发布于 2018-05-29 19:48:43
在visual studio 2015中使用clang-cl 5或6:
template <auto func>
int Start() {
using R = decltype(func());
typedef decltype(&usualfunc<R, func>) D;
D p = &usualfunc<R, func>;
uintptr_t add = (uintptr_t)p;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)add, 0, 0, 0);
return 1;
}
这个编译得很好。
https://stackoverflow.com/questions/50574813
复制相似问题