小编sme*_*lin的帖子

数组初始化,引用前一个元素好吗?

const QPointF points[] =
{
    QPointF(r.left() - i, r.top() - i),
    QPointF(r.right() + i, r.top() - i),
    QPointF(r.right() + i, r.bottom() + i),
    QPointF(r.left() - i, r.bottom() + i),
    points[0] // is this line valid (according to the C++ standard)?
};
Run Code Online (Sandbox Code Playgroud)

虽然这与MS Visual Studio编译器编译,但我不确定这是否是根据C++标准的有效代码.

标准的报价将受到高度赞赏.

c++ arrays standards initialization

9
推荐指数
1
解决办法
430
查看次数

为什么for_each不能修改其仿函数参数?

http://www.cplusplus.com/reference/algorithm/for_each/
一元函数将范围内的元素作为参数.这可以是指向函数的指针,也可以是类重载operator()的对象.其返回值(如果有)将被忽略.

根据这篇文章,我预计for_each实际上会修改作为第三个参数给出的对象,但似乎for_each对临时对象进行操作,甚至不会修改赋予它的对象.

那么,为什么以这种方式实施呢?它似乎没那么有用.或者我误解了什么,下面的代码包含错误?

#include <iostream>
#include <vector>
#include <algorithm>

template <class T> struct Multiplicator{
    T mresult;
  public:
    const T& result() const{return mresult;}
    Multiplicator(T init_result = 1){
      mresult = init_result;
    }
    void operator()(T element){
      mresult *= element;
      std::cout << element << " "; // debug print
    }
};

int main()
{
    std::vector<double> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    Multiplicator<double> multiply;
    std::for_each(vec.begin(),vec.end(),multiply);
    std::cout << "\nResult: " << multiply.result() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

预期产量:

1 2 3 Result: 6
Run Code Online (Sandbox Code Playgroud)

但得到以下输出:

1 2 3 …
Run Code Online (Sandbox Code Playgroud)

c++ foreach stl

8
推荐指数
2
解决办法
2566
查看次数

QObject(QPlainTextEdit)和多线程问题

我目前正在尝试使用Python asyncore和pyqt4学习网络.

我编写了一个小型服务器,它基本上监听某个端口,并将收到的所有消息重新发送给发送方.

由于这两种QTS QApplication.exec_()asyncore.loop()是永不回我不能都在一个线程启动它们的功能,所以我盯着asyncore.loop()在一个单独的守护线程.

每当我的服务器类(派生自asyncore.dispatcher)建立或删除连接,或发送/接收消息时,它都会调用我的窗口类(派生自QtGui.QMainWindow)的方法,这些方法在a中显示信息QPlainTextEdit.

但除非您使用鼠标标记文本,否则文本不可见.

Python控制台显示以下错误消息:

QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
Run Code Online (Sandbox Code Playgroud)

我在一些论坛上看到,这可能是由于从另一个线程调用qt-functions引起的,并且使用信号和插槽而不是普通函数调用可能会解决问题,但我也试过了信号,我仍然得到这个错误.

所以,(如果这确实是我的问题的原因)有什么正确的方法从另一个线程调用qt对象的方法?

编辑更多信息: asyncore.loop()调用位于子线程中,它不是真正阻塞,但仅在asyncore.loop()的运行时期间,我的Server类(asyncore.dispatcher)可以进行网络连接.因此,在asyncore.loop()的运行时期间,我的Server类的方法由asyncore.loop()(=子线程)调用,并且在这些我试图向主线程中运行的窗口类发出信号

编辑:好像我现在正在使用它,我的代码中有一些错误,现在所有信号都按预期工作.

编辑:小例子:http://paste2.org/p/635612(死链接)

python multithreading qt4 pyqt4 asyncore

8
推荐指数
1
解决办法
1万
查看次数

qpainter绘画替代品(性能在Mac上很糟糕)

我有一个类在QWidget中显示音频文件的波形数据(见下面小部件的屏幕截图,然后我仍然使用渐变,这导致性能不佳).

音频数据直接在widget上使用多次调用绘制在paintEvent中QPainter::drawLine(最小调用量QWidget::drawLine相当于widget的宽度=>每个x坐标至少有一行).虽然该方法在Windows上运行良好(全屏的paintEvent大约需要4毫秒),但在MacOS下运行程序时,性能会下降4-5倍.

绘画的性能对于显示数据的流体滚动很重要.

所以我的问题是,有没有人知道更快的QPainter.drawLine替代方案来绘制线条(平台相关的解决方案可能没问题,只要它们可以在paintEvent中使用),或者有没有办法加快滚动,某种缓冲等?

小部件的旧屏幕截图(仍然使用渐变,导致性能不佳)

c++ macos performance qt paint

8
推荐指数
1
解决办法
3736
查看次数

为什么typeid不像sizeof那样编译时常量

为什么typeid(someType)不像sizeof(someType)那样是常量?

这个问题出现了,因为最近我尝试了类似的东西:

template <class T>
class Foo
{
    static_assert(typeid(T)==typeid(Bar) || typeid(T)==typeid(FooBar));
};
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么编译器在编译时知道类型的大小(sizeof),而不是类型本身(typeid)

c++

5
推荐指数
2
解决办法
2164
查看次数

PyCharm调试器因AttributeError而失败

我无法在PyCharm中调试Flask应用程序.应用程序应该在端口5000上运行:app.run(host="10.1.0.17", port=5000, debug=True).控制台输出是:

C:\Python\python.exe "C:\Program Files (x86)\JetBrains\PyCharm 145.597.11\helpers\pydev\pydevd.py" --multiproc --qt-support --client 127.0.0.1 --port 10498 --file "D:/TGM/SMS/SMS/Back .v2/wsgi.py"

pydev debugger: process 4108 is connecting
Could not connect to 127.0.0.1: 10499

Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm 145.597.11\helpers\pydev\pydevd.py", line 1523, in <module>
    debugger.connect(host, port)
  File "C:\Program Files (x86)\JetBrains\PyCharm 145.597.11\helpers\pydev\pydevd.py", line 317, in connect
    self.initialize_network(s)
  File "C:\Program Files (x86)\JetBrains\PyCharm 145.597.11\helpers\pydev\pydevd.py", line 304, in initialize_network
    self.writer = WriterThread(sock)
  File "C:\Program Files (x86)\JetBrains\PyCharm 145.597.11\helpers\pydev\_pydevd_bundle\pydevd_comm.py", line 392, in __init__
    self.cmdQueue = …
Run Code Online (Sandbox Code Playgroud)

python pydev pycharm flask

5
推荐指数
1
解决办法
3794
查看次数

关于c ++模板函数的问题,只要该类型符合至少一个要求,就可以使用任何类型

由于我无法解释这一点,我将立即从一个小例子开始:

template <class T> void Print(const T& t){t.print1();}
template <class T> void Print(const T& t){t.print2();}
Run Code Online (Sandbox Code Playgroud)

这不编译:
error C2995: 'void Print(const T &)' : function template has already been defined

那么,我怎样才能创建一个模板函数,T只要该类型具有print1成员函数或print2成员函数(没有多态性),它就采用任何类型?

c++ templates

4
推荐指数
1
解决办法
296
查看次数

枚举成员的值,当某些成员具有用户定义的值时

enum ABC{
 A,
 B,
 C=5,
 D,
 E
};
Run Code Online (Sandbox Code Playgroud)

D和E是否保证大于5?
A和B是否保证小于5(如果可能)?

编辑:如果我说会发生什么C=1

c++ enums

4
推荐指数
1
解决办法
589
查看次数

(静态初始化/模板实例化)工厂模式的问题

为什么以下代码会异常引发异常(在createObjects调用中map::at),代码(及其输出)可以在这里查看

有趣的是,如果注释行与microsoft和gcc编译器一起取消注释(参见此处),代码将按预期工作,这甚至可以将initMap用作普通静态变量而不是静态getter.

我可以想到的唯一原因是静态registerHelper_ object(factory_helper_)和std::mapobject(initMap)的初始化顺序是错误的,但我不知道如何发生这种情况,因为map对象是在第一次使用时构建的,那就是在factory_helper_构造函数中,所以一切都应该没问题呢?我更为惊讶的是那些doNothing()行修复了这个问题,因为无论如何都会在关键部分(当前失败)之后调用doNothing().

编辑:调试显示,没有调用factory_helper_.doNothing(),从不调用factory_helper_的构造函数.

#include <iostream>
#include <string>
#include <map>

#define FACTORY_CLASS(classtype) \
extern const char classtype##_name_[] = #classtype; \
class classtype : FactoryBase<classtype,classtype##_name_>

namespace detail_
{
    class registerHelperBase
    {
    public:
        registerHelperBase(){}
    protected:
        static std::map<std::string, void * (*)(void)>& getInitMap() {
            static std::map<std::string, void * (*)(void)>* initMap = 0;
            if(!initMap)
                initMap= new std::map<std::string, void * (*)(void)>();
            return *initMap;
        }
    };

    template<class TParent, const char* ClassName>
    class registerHelper_ …
Run Code Online (Sandbox Code Playgroud)

c++ static factory

4
推荐指数
1
解决办法
863
查看次数

有没有办法在不破坏封装的情况下为模板类(适用于所有类型)提供单个静态变量

我需要一种方法来为我的模板类的各种类型提供单个静态变量

template <class T> class Foo { static Bar foobar;};

好吧,上面的行将为每种类型生成一个名为foobar的Bar对象T,但这不是我想要的,我基本上想要一种声明类型为Bar的变量的方法,因此每个类型的对象Foo都可以访问相同的foobar变量,独立的T.

我试图使用另一个类来存储私有东西,但这不起作用,因为标准不允许这样的东西 template <class T> friend class Foo<T>;

所以明显的解决方案(如下所示)是有一个全局变量Bar foobar,但这显然违反了信息隐藏概念(适当的封装):

Bar Foo_DO_NOT_TOUCH_THIS_PLEASE_foobar;
template <class T> class Foo { static Bar& foobar;};
template <class T> Bar& Foo<T>::foobar=Foo_DO_NOT_TOUCH_THIS_PLEASE_foobar;
Run Code Online (Sandbox Code Playgroud)

当然,你可以另外使用一个详细命名空间(这就是我目前正在做的事情),但还有另一种方法可以真正禁止用户搞乱你的私有静态变量吗?

另外,当你必须以类似的方式声明许多静态方法时,这个解决方案会变得非常混乱,因为你很可能必须使用friend关键字来扩展friend RetType Foo_detail::StaticFunc(ArgT1, ArgT2).

用户不会有一个很好的界面,因为他们不能像以前那样使用这些功能,Foo<T>::someFunc()而是他们必须调用类似的东西Foo_static::someFunc()(如果你使用命名空间Foo_static用于公共静态函数).

那么有没有其他解决方案不破坏封装,和/或不会引入大量的语法开销?

编辑:基于你所有的anwsers,我试过跟随,它按预期工作:

typedef int Bar;
template <class T> class Foo;

class FooBase
{
    static Bar foobar;
    public:
        template <class T> …
Run Code Online (Sandbox Code Playgroud)

c++ static templates

3
推荐指数
1
解决办法
209
查看次数

基本类型

我一直认为以下类型是"基本类型",所以我认为我对这个问题的回答是正确的,但令人惊讶的是它被推翻了......

搜索网络,我发现了这一点.所以,IBM也说这些类型是基本类型..

那么你如何解读标准? 以下类型(和类似类型),"基本类型"是否符合C++标准?

unsigned int
signed char
long double
short int
unsigned short int
Run Code Online (Sandbox Code Playgroud)

编辑:
再次与这个问题相关:Comceau和gcc不要将"long double","short int"或"unsigned int"等类型视为"基本类型"!(而ibm,intel和microsoft编译器都这样做.)如果他们确实将这些类型视为基本类型,则应编译以下代码:short int i = short int()

编辑:
删除long long类型,因为我忘了他们还没有正式标准..

c++ standards types

2
推荐指数
1
解决办法
1050
查看次数

选择具有多个不同列值组合的行

我有一个表3列:id,val1val2.

对于val2的每个不同值,我想选择存在多个不同val1值的所有行.

例:

| id | val1 | val2 |
|------------------|
| 1  | A1   |  a2  |
| 2  | A1   |  a2  |
| 3  | A1   |  b2  |
| 4  | B1   |  b2  |
| 5  | A1   |  c2  |
| 6  | A1   |  c2  |
| 7  | A1   |  c2  |
| 8  | A1   |  d2  |
| 9  | C1   | …
Run Code Online (Sandbox Code Playgroud)

sql postgresql select postgresql-9.1

2
推荐指数
1
解决办法
549
查看次数

Qt的IP地址窗口小部件,类似于MFC的IP地址控制

我在Qt中寻找一个类似于MFC的IP地址控件的小部件.有没有人知道这样的小部件,或者我可以创建一个小部件?

ip qt mfc

1
推荐指数
2
解决办法
1万
查看次数