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++标准的有效代码.
标准的报价将受到高度赞赏.
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) 我目前正在尝试使用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(死链接)
我有一个类在QWidget中显示音频文件的波形数据(见下面小部件的屏幕截图,然后我仍然使用渐变,这导致性能不佳).
音频数据直接在widget上使用多次调用绘制在paintEvent中QPainter::drawLine(最小调用量QWidget::drawLine相当于widget的宽度=>每个x坐标至少有一行).虽然该方法在Windows上运行良好(全屏的paintEvent大约需要4毫秒),但在MacOS下运行程序时,性能会下降4-5倍.
绘画的性能对于显示数据的流体滚动很重要.
所以我的问题是,有没有人知道更快的QPainter.drawLine替代方案来绘制线条(平台相关的解决方案可能没问题,只要它们可以在paintEvent中使用),或者有没有办法加快滚动,某种缓冲等?

为什么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)
我无法在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) 由于我无法解释这一点,我将立即从一个小例子开始:
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成员函数(没有多态性),它就采用任何类型?
enum ABC{
A,
B,
C=5,
D,
E
};
Run Code Online (Sandbox Code Playgroud)
D和E是否保证大于5?
A和B是否保证小于5(如果可能)?
编辑:如果我说会发生什么C=1
为什么以下代码会异常引发异常(在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) 我需要一种方法来为我的模板类的各种类型提供单个静态变量
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) 我一直认为以下类型是"基本类型",所以我认为我对这个问题的回答是正确的,但令人惊讶的是它被推翻了......
搜索网络,我发现了这一点.所以,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类型,因为我忘了他们还没有正式标准..
我有一个表3列:id,val1和val2.
对于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) 我在Qt中寻找一个类似于MFC的IP地址控件的小部件.有没有人知道这样的小部件,或者我可以创建一个小部件?