我希望能够使用新的模板参数推导的地方之一就是构建带有自定义比较器的std::set's/std::maps /任何其他容器 - 我的目标是创建一个单行语句,这将创建一个高效的用lambda比较器设置.自C++ 11以来我能做的是:
std::set<int, std::function<bool(int, int)>> s([](int a, int b) {return a > b;});
Run Code Online (Sandbox Code Playgroud)
但由于它使用std::function,它明显变慢.
另一种选择是:
auto mycomp = [](int a, int b) {return a > b; };
std::set<int, decltype(mycomp)> s(mycomp);
Run Code Online (Sandbox Code Playgroud)
它完成了工作,但1)它需要2行,并创建mycomp变量2)我需要mycomp显式传递的类型.
正如我在参考页面上看到的那样,没有一个标准容器有针对这种情况的扣除指南.不幸的是,我担心它甚至无法用当前的语言标准(C++ 17)完成,因为人们可以找到:
仅当不存在模板参数列表时,才会执行类模板参数推导.如果指定了模板参数列表,则不会进行演绎.
这背后的原因是什么?为什么他们不允许部分论证扣除?我想它有些问题我忽略了,但在我看来,它会有所帮助.
c++ templates template-argument-deduction argument-deduction c++17
我正在尝试使用 Visual Studio 2022 及其分析工具来分析使用 CMake 项目构建的 C++ 应用程序。
\n我以 RelWithDebInfo 模式和 MSVC_x64_x64 工具集构建项目。
\n我添加了这个片段:
\nif (MSVC)\nset_target_properties(${BUILD_TARGET} PROPERTIES LINK_FLAGS "/PROFILE")\nendif()\nRun Code Online (Sandbox Code Playgroud)\n添加到我的 CMake 文件中,通过此添加,我可以选择“调试->性能分析器->目标:{我的 exe}+CPU 使用情况->运行”。
\n然而,在我完成捕获分析数据后,我得到的信息是,我的程序 100% 的时间都花在函数“Idle”上:
\n\xc2\xa0+\xc2\xa0Idle (PID: 0) 4767 (100,00%) 3335 (69,96%) Idle\n\xc2\xa0-\xc2\xa0[System call]\n ntoskrnl.dll!0xfffff806317fad1e 926 (19,43%) 926 (19,43%) ntoskrnl\nRun Code Online (Sandbox Code Playgroud)\n没有关于我的代码的任何信息。我究竟做错了什么?
\n或者是否无法使用 Visual Studio 调试 CMake 项目?
\n@编辑
\n看来是VS2022的一个bug。我下载了VS2019,运行得很好。
\n@编辑
\n该问题已经被报道过几次,似乎与 Windows 10 内核中的一些错误有关。解决方案已经实施,并将在下次更新中提供。
\n在C++中是否有任何方法可以检查我的程序是由用户还是自动启动程序启动的?我希望在这些情况下显示/不显示窗口.
std::execution::unseq在C++20中,添加了另一个执行策略: 。这意味着,算法将在当前线程上执行,但不保证操作将按元素的顺序完成。
将其添加到语言中的理由是什么?它可以实现哪些优化?据我查看实现情况,这个标志几乎被完全视为seq,除非我错过了一些东西(可能是)。根据我的经验,编译器已经识别出可以向量化的循环(对于简单类型),并且由于“as-if”规则,向量化是可能的,无需任何特殊标志。那么,有什么std::execution::unseq变化呢?