小编Dmi*_*nov的帖子

如何在 Qt 小部件中使用 QStringView(或 QStringRef)?

我正在尝试用更轻的替代品( / )QString来代替重的类别。问题是 Qt 小部件无论如何都不会使用这些类。例如,该方法需要作为输入参数,使我的改进毫无用处。QStringRefQStringViewQLabel::setTextconst QString&

我对这种差异感到困惑。这是故意的吗?这有什么理由吗?QStringView如果一天结束时没有人消费它们,那么用例应该是什么?

c++ qstring qt

7
推荐指数
1
解决办法
4477
查看次数

未来是否从 std::async 返回,并在析构函数中使用 launch::deferred 策略块?

在描述中是std::async这样说的:

如果std::future获取的 fromstd::async没有从引用移动或绑定到引用,则 the 的析构函数std::future将在完整表达式的末尾阻塞,直到异步操作完成,本质上使代码如下同步:

std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f()
std::async(std::launch::async, []{ g(); }); // does not start until f() completes
Run Code Online (Sandbox Code Playgroud)

(请注意,通过调用 std::async 以外的方式获得的 std::futures 的析构函数永远不会阻塞)

这个说法令人困惑,我不清楚在std::launch::deferred政策的情况下应该是什么行为。好吧,实验表明,它不会阻止,但我不知道是否规范明确地说,从未来返回std::asyncstd::launch::deferred政策的析构函数不会阻塞。

这打开了另一个关于默认策略的后续问题:如果未来从std::async析构函数中的块返回,std::launch::async并且在 的情况下不阻塞std::launch::deferred,那么在默认 ( std::launch::async | std::launch::deferred) 策略的情况下应该会导致非常不一致的行为。最近我在问std::asyncwith default launch policy的语义:std::async with automatic (launch::async|launch::deferred) launch policy 的语义是什么?,这个例子更让我困惑,在我们不明确知道策略的平台选择的情况下,模式的适用性是非常值得怀疑的。

更新:我发现标准P0701r1的提案并没有完全回答我的问题,但如果该提案被接受,它将解决阻塞/非阻塞析构函数的歧义。

c++ future language-lawyer c++11 stdasync

6
推荐指数
0
解决办法
171
查看次数

如何为 GitHub 中的孤立提交分配标签?

我有一个由另一个人生成的孤立提交,我在 GitHub GUI 中看到了它。由于路径上没有包含此提交的分支/标签,因此无法通过克隆存储库来访问此提交。假设提交的作者已经删除了他的本地存储库,我希望直接在 GitHub 中为这个提交分配一个分支/标签。

只需使用我可以使用的直接链接即可看到此提交,因为它的 git hash 是已知的。但是,在Insights>Network中看不到提交。

如何从 GitHub 中的此提交页面为提交分配标签?是否可以直接从此页面创建新分支?有什么其他方法可以将此提交返回到服务中?

git github orphaned-objects

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

为什么 std::stringstream 不能与 std::string_view 一起使用?

初始化std::stringstream 构造函数接受const string&以下参数:

explicit stringstream (const string& str,
                       ios_base::openmode which = ios_base::in | ios_base::out);
Run Code Online (Sandbox Code Playgroud)

这个接口在 C++98 中是合理的,但从 C++17 开始,我们有了std::string_view表示字符串的类的更便宜的替代方案。该类std::stringstream不会修改它接受的字符串,不拥有它,也不要求它以空终止。那么为什么不添加另一个接受 的构造函数重载呢std::string_view?是否存在任何障碍使该解决方案不可能(或不合理)屈服于Boost::Iostreams等替代方案?

c++ istringstream string-view c++17

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

为什么 stoi 不允许 std::basic_string 作为输入?

为了提高性能,我尝试std::string用自定义专业化来替代,std::basic_string其中我用自定义分配器替换标准分配器。有一件事让我感到惊讶:std::stoi函数类需要不断引用std::string(或std::wstring) 作为输入,因此这些函数不能与其他专业化一起使用。但从逻辑上讲,这些函数不应该关心内存是如何分配的;所以他们的签名看起来过于限制。

虽然我可以使用std::from_chars从任何类似字符串的数据中读取整数,但我仍然想知道是否有这样设计的原因std::stoi,以及是否还有其他设计用于与std::basic_string模板一起使用的 STL 函数。

c++ stdstring stoi

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

C++ 线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取..会遇到问题吗?

如果一个线程读取另一个线程正在写入的非原子原始变量,是否保证在写入之前或之后读取该值,或者它是否可以在写入期间以某种方式读取某些损坏的版本?

我意识到诸如链表之类的集合是另一回事。

c++ concurrency

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

在 C++17 中引用 const 字符串的语义应该是什么?

有几种方法可以将文本信息传递给 C++ 中的函数:可以是 c-string/std::string、按值/按引用、左值/右值、常量/可变的。C++17 在标准库中添加了一个新类:std::string_view. string_view 的语义是提供没有所有权的只读文本信息。因此,如果您只需要读取一个字符串,您可以使用:

void read(const char*);        // if you need that in a c-style function or you don't care of the size
void read(const std::string&); // if you read the string without modification in C++98 - C++14
void read(std::string_view);   // if you read the string without modification in C++17
Run Code Online (Sandbox Code Playgroud)

我的问题是在 C++17 中void read(const std::string&)是否应该优先考虑任何情况void read(std::string_view)。假设不需要向后兼容性。

c++ string-view c++17

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

操作系统从哪里获取 $OSTYPE 的值

我有一个依赖于$OSTYPE变量值的遗留脚本。该脚本期望在 Solaris 上该值为“SunOS”,而在 AIX 上该值为“AIX”。对于 Linux,它根据正则表达式检查变量,其中大写值以“LINUX”开头。

我尝试从 Jenkins 运行此脚本,发现值不同:Solaris 返回“solaris2.11”,而 AIX 返回“aix7.1.0.0”。我echo $OSTYPE在 Jenkins 运行脚本的同一台服务器上运行了该命令,并且得到了“SunOS”/“AIX”。

所以我的主要问题是:这种差异的根源是什么(系统如何形成这个变量的值,以及为什么 Jenkins 具有与从 bash 运行的 echo 不同的值)。一个附带问题是哪种是可靠的使用方式$OSTYPE

bash jenkins os-detection

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

如何使用 JSON 正文在 Qt 中发送 POST 请求

我正在尝试从 Qt 发送一个 POST 请求,其中正文为 JSON 格式。首先,我断言请求在 curl 中有效:

curl -i -H "Content-Type: application/json" -d '{"key1": "value1", "key2": "value2"}' -X POST http://myserver.com/api
Run Code Online (Sandbox Code Playgroud)

工作正常,我收到了来自服务器的预期响应。在 Python 中同样有效。现在我需要从 C++/Qt 发送这个请求:

QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
QHttpMultiPart *httpMultiPart = new QHttpMultiPart(mgr);
QHttpPart *httpPart = new QHttpPart();
httpPart->setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
httpPart->setBody("{\"key1\":\"value1\", \"key2\":\"value2\"}");

httpMultiPart->append(*httpPart);

QNetworkReply *reply = mgr->post(QNetworkRequest(QUrl("http://myserver.com/api")), httpMultiPart);
QObject::connect(reply, &QNetworkReply::finished, [=]()
        {
            QString err = reply->errorString();
            QString contents = QString::fromUtf8(reply->readAll());
        });
Run Code Online (Sandbox Code Playgroud)

现在我收到一个错误,其中 errorString 返回:`

"Error downloading http://myserver.com/api - server replied: Unsupported Media Type"`
Run Code Online (Sandbox Code Playgroud)

原因是什么?我应该如何像使用 curl 发送的那样发送 …

post qt json content-type qnetworkaccessmanager

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