调试信号和插槽可能很难,因为调试器在发出时不会跳转到信号的插槽.调试Qt信号和插槽有哪些最佳实践?
特别是
我有一个(快速)查看C++标准和在线C++参考,但我找不到这个简单问题的答案:
可以std::list<int>
抛出默认构造函数吗?
如果是这样,为什么会抛出?
D拥有一个出色的模块系统,与C++相比,它可以大大缩短编译时间.根据文档,D仍然提供不透明的结构和联合,以便启用pimpl习语.我的问题是:如何在一个模块中声明嵌套结构(或联合)并在另一个模块中定义它?那是什么语法?
在C++中,标题看起来像这样
struct S {
...
struct Impl;
Impl * p;
};
Run Code Online (Sandbox Code Playgroud)
并且实现文件(cpp-file)将使用一些有趣的::
-syntax,如下所示:
#include "header.h"
struct S::Impl {
...
};
Run Code Online (Sandbox Code Playgroud)
如何在D中实现相同的功能?
C ++标准库中的所有类都有成员交换函数,包括一些多态类,例如std::basic_ios<CharT>
。模板类std::shared_future<T>
显然是一个值类型,并且std::future<T>
是仅移动值类型。是否有任何特定原因,它们不提供swap()
成员函数?
我正在尝试将托管和本机 dll 加载到我的 C# 应用程序中。我想设置 PATH 环境变量,以便应用程序可以找到要加载的 dll。在 C++ 中这很容易,但我如何在 C# 项目中做到这一点?(顺便说一下,我使用的是 VS2012、.NET、WPF)
我正在使用Visual Studio 2012中的Qt 5.3.1构建应用程序.我还想使用一个硬件库,它要求我向项目添加一个简单的ATL对象.这可以通过使用Visual Studio向导来完成.向导抱怨我的项目既不是MFC可执行文件也不是具有完全ATL支持的MFC DLL.
我的问题是:如何将此支持添加到我的应用程序中?在项目属性中,我将项目配置为链接到ATL并使用MFC.那没起效.静态和动态.
如果有另一个解决方案是为了向项目添加一个简单的ATL对象,请告诉我.
假设你有d是一个函数pure
,并nothrow
通过它的返回类型和参数类型不能通过任何新分配的内存.我可以将@nogc
属性添加到此功能吗?如果没有,将来有可能实现这一目标吗?
我的观点如下:由于该函数没有任何可见的副作用,因此在函数退出时可以确定地释放在路上分配的所有内存.因此,实际上不需要GC,因为可以避免标记和扫描步骤.或者不可以吗?
我正在做一些模板元编程,我想实现一个通用的克隆函数,它根据SFINAE表达式的有效性选择克隆方法(替换失败不是错误).
在这个参考网站上它说
功能
make_unique<T>( std::forward<Args>(args)... )
Run Code Online (Sandbox Code Playgroud)
相当于:
Run Code Online (Sandbox Code Playgroud)unique_ptr<T>(new T(std::forward<Args>(args)...))
这是否意味着以下代码
template <typename T>
auto my_clone( const T & t ) -> decltype( std::make_unique<T>(t) )
{
return std::make_unique<T>(t);
}
Run Code Online (Sandbox Code Playgroud)
应完全等同于
template <typename T>
auto my_clone( const T & t ) -> decltype( std::unique_ptr<T>( new T(t) ) )
{
return std::unique_ptr<T>( new T(t) );
}
Run Code Online (Sandbox Code Playgroud)
即使我有其他功能的重载my_clone
?换句话说:std::make_unique()
SFINAE友好吗?
如果T
是没有拷贝构造的,那么后者的代码不会因SFINAE参与重载决议.
这是一个小例子,无法在启用C++ 14的GCC 5.3上编译:
#include <memory>
// It does **not** work with this snippet:
template …
Run Code Online (Sandbox Code Playgroud) 是否有符合便携式标准的方法来创建1970年1月1日00:00:00的std :: chrono :: time_point?这必须是线程安全的.因此,解决方案应该避免类似的功能std::gmtime()
,std::localtime()
并且没有线程安全保证.
这不是将std :: chrono :: time_point转换为unix时间戳的重复,因为我要求一个线程安全的可移植解决方案.那里的问题也没有要求,答案也没有提供这种保证.
我有一些看起来有点像这样的代码:
void writeToStream( std::ostream & outputStream )
{
MyXmlWriter xmlWriter{ outputStream };
xmlWriter.addNode();
xmlWriter.addNode();
xmlWriter.close(); // should this be called in `MyXmlWriter` destructor?
}
Run Code Online (Sandbox Code Playgroud)
close函数会写一些xml关闭标记,以便正确解析文件.构造函数编写xml文件的标头.人们可以考虑xmlWriter.close();
清理代码.C++的常见建议是将清理代码放入析构函数中.这样你就永远不会忘记清理干净.但是,在我们的例子中,清理代码可能会抛出.(想象一下,file
可能启用了异常,对文件的写入可能会失败.)因此,如果close()
在析构函数中调用该函数,那么它应该包装在try-catch块中,该块会占用抛出的所有异常:
MyXmlWriter::~MyXmlWriter()
{
try
{
close();
}
catch (...)
{
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,呼叫者不会收到有关任何错误的通知.该函数writeToStream()
可能无法将关闭的xml标记写入文件,而调用者不知道它.在这种情况下,最佳做法是什么?
c++ ×6
c++11 ×2
d ×2
debugging ×2
atl ×1
c# ×1
c++-chrono ×1
com ×1
connection ×1
destructor ×1
dll ×1
exception ×1
file-io ×1
future ×1
list ×1
mfc ×1
pimpl-idiom ×1
qt ×1
sfinae ×1
swap ×1
time ×1
unique-ptr ×1