相关疑难解决方法(0)

使用具有可变参数模板函数的decltype的尾随返回类型

我想写一个简单的加法器(giggles),它将每个参数相加并返回一个具有适当类型的和.目前,我有这个:

#include <iostream>
using namespace std;

template <class T>
T sum(const T& in)
{
   return in;
}

template <class T, class... P>
auto sum(const T& t, const P&... p) -> decltype(t + sum(p...))
{
   return t + sum(p...);
}

int main()
{
   cout << sum(5, 10.0, 22.2) << endl;
}
Run Code Online (Sandbox Code Playgroud)

在GCC 4.5.1上,这似乎适用于2个参数,例如sum(2,5.5)返回7.5.但是,由于参数多于此,我得到的错误是sum()尚未定义.如果我这样声明sum():

template <class T, class P...>
T sum(const T& t, const P&... p);
Run Code Online (Sandbox Code Playgroud)

然后它适用于任意数量的参数,但sum(2,5.5)将返回整数7,这不是我所期望的.有两个以上的参数我假设decltype()必须进行某种递归才能推导出t + sum(p ...)的类型.这是合法的C++ 0x吗?或者decltype()仅适用于非可变参数声明吗?如果是这样的话,你会怎么写这样的功能?

c++ templates variadic-functions decltype c++11

38
推荐指数
3
解决办法
5626
查看次数

如何利用Qt使QObject方法线程安全?

假设我们在QObject-deriving类中编写了一个非const方法:

class MyClass : public QObject {
  int x;
public:
  void method(int a) {
    x = a; // and possibly other things
  };
};
Run Code Online (Sandbox Code Playgroud)

我们希望使该方法成为线程安全的:意味着从任意线程调用它,并且同时从多个线程调用它,不应该引入未定义的行为.

  1. Qt提供了哪些机制/ API来帮助我们使该方法具有线程安全性?

  2. Qt的哪些机制/ API可以在方法执行"其他事情"时使用?

  3. 是否可以对"其他事物"进行分类,以便为使用Qt特定的机制/ API提供信息?

非主题是C++标准本身提供的机制,以及确保线程安全的通用/非Qt特定方式.

c++ qt thread-safety qthread

6
推荐指数
1
解决办法
1567
查看次数

如何将lambda函数排队到Qt的事件循环中?

基本上我需要在Java中完成同样的事情:

SwingUtilities.invokeLater(()->{/* function */});
Run Code Online (Sandbox Code Playgroud)

或者在javascript中这样:

setTimeout(()=>{/* function */}, 0);
Run Code Online (Sandbox Code Playgroud)

但是用Qt和lambda.所以有些伪代码:

Qt::queuePushMagic([]() { /* function */ });
Run Code Online (Sandbox Code Playgroud)

作为一个额外的复杂性,我需要这个在多线程上下文中工作.我实际上要做的是在正确的线程中自动运行某些方法.那么代码看起来如何:

SomeClass::threadSafeAsyncMethod() {
    if(this->thread() != QThread::currentThread()) {
        Qt::queuePushMagic([this]()=>{ this->threadSafeAsyncMethod() });
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

c++ lambda qt event-loop qthread

6
推荐指数
2
解决办法
1328
查看次数