首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >decltype的参数不正确

decltype的参数不正确
EN

Stack Overflow用户
提问于 2018-05-29 08:32:33
回答 3查看 440关注 0票数 1

两天前,我问过关于创建线程来使用Win32应用程序接口运行非静态类方法的问题,我几乎得到了一个解决方案,但有一些问题让我感到困惑,所以我在发布上一个问题的答案之前问了这个问题。

我正在尝试使用这段代码来线程一个返回类型未知的函数:

代码语言:javascript
复制
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上描述了错误描述:

Compiler Error C3556

然而,我在此之前尝试了另一个代码,它工作得很好,但我对语法不是很了解:

代码语言:javascript
复制
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()不能将函数作为参数传递。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-29 09:22:41

模板参数在编译时必须是已知的。但是,您尝试使用普通函数参数func作为模板参数。

在第二段代码中,您给出了一个模板参数作为模板参数,这很好。

您的第一个代码是错误的,原因与下面的代码类似:

代码语言:javascript
复制
template<int X> void f() { }

int main(int argc, char **argv) { f<argc>(); }

尽管错误消息比较模糊。

由于C++17,您可以通过对第二个代码进行以下修改来获得所需的语法:

代码语言:javascript
复制
template <auto func>
int Start() {
    using R = decltype(func());
    // proceed as before...

把它叫做Start<ltest>();

在使用C++17之前,您可以在第二个代码中使用宏:

代码语言:javascript
复制
#define START(func) Start<decltype(func()), func>
票数 3
EN

Stack Overflow用户

发布于 2018-05-29 17:25:54

因为我使用的是visual studio 2015,不能使用自动模板,所以我使用了M.M所说的宏,并以此结束

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2018-05-29 19:48:43

在visual studio 2015中使用clang-cl 5或6:

代码语言:javascript
复制
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;
}

这个编译得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50574813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档