草庐IT

std-ranges

全部标签

c++ - 为什么 std::thread 采用右值运行的函数?

std::thread有一件事我不明白:为什么std::thread的构造函数采用右值运行的函数?我通常想将具有一些成员的Functor运行到另一个线程。像这样:structFunction{voidoperator()(/*someargs*/){/*somecode*/}/*somemembers*/}voidrun_thread(){Functorf(/*somedata*/);std::threadthread(f,/*somedata*/);/*dosomethingandwaitforthreadtofinish*/}随着std::thread的当前实现,我必须确保我的对象

c++ - 为什么 COW std::string 优化在 GCC 5.1 中仍然启用?

根据GCC5发布更改页面(https://gcc.gnu.org/gcc-5/changes.html):Anewimplementationofstd::stringisenabledbydefault,usingthesmallstringoptimizationinsteadofcopy-on-writereferencecounting我决定检查一下并写了一个简单的程序:intmain(){std::stringx{"blah"};std::stringy=x;printf("0x%X\n",x.c_str());printf("0x%X\n",y.c_str());x[0]=

c++ - 使用 std::string 调用类方法

假设我有以下类(class):(可能是元生成的)classMyClass{public:myMethod();...}这里假设一些事情:1.)Ihavetheclassnamefromsomewhere(let'spretend)2.)Ihavethenamesoftheclassmethodssomewhere(std::map...perhaps?)所以...因为我可能直到运行时才知道myMethod()的名称,有没有办法使用std::string调用它?这是假设我在某处存储了一个类函数的名称。MyClassexample;std::stringfuncName{findMyMet

c++ - 如何将 std::ofstream 重定向到 std::cout?

我正在处理一些使用std::ofstream*类型的全局调试记录器的代码。我想将它重定向到std::cout,因为我正在实时使用代码,而不是为它设计的批处理方法。是否可以将它使用的全局std::ofstream*指针重定向到std::cout?我知道std::ofstream继承自std::ios,它允许使用rdbuf()方法更改流缓冲区,但是不幸的是,std::ofstream重新定义了rdbuf()方法,这使得以下代码无法编译:gOsTrace=newstd::ofstream();gOsTrace->rdbuf(std::cout.rdbuf());是否有另一种方法可以将gOsT

C++ typedef a std::pair 然后使用typedef声明一个映射

假设我有这个typedeftypedefstd::pairMyType;那么,如果我也想使用MyType创建map,我该怎么做呢?我不想重新键入这对中的两种类型,例如:mapmyMap;我想要这样的东西:mapmyMap;有没有办法使用我的typedefMyType而不是重新键入类型来做到这一点? 最佳答案 简单...std::mapmyMap;参见http://en.cppreference.com/w/cpp/utility/pair示例程序位于coliru 关于C++typedef

c++ - 自旋锁与 std::mutex::try_lock

使用专门设计的自旋锁(例如http://anki3d.org/spinlock)与这样的代码相比有什么好处:std::mutexm;while(!m.try_lock()){}#doworkm.unlock(); 最佳答案 在典型的硬件上,有很多好处:您天真的“假自旋锁”可能会在CPU旋转时使内部CPU总线饱和,从而使其他物理内核(包括持有锁的物理内核)处于饥饿状态。如果CPU支持超线程或类似的东西,您天真的“假自旋锁”可能会消耗物理内核上的过多执行资源,使共享该物理内核的另一个线程处于饥饿状态。您天真的“假自旋锁”可能会执行无关的

c++ - 将 std::function<int(int)> 赋值给 std::function<const int&(const int& x)>

以下代码编译但在VC++2015(发行版)中产生未定义的输出和运行时错误othercompilers.#include#includeintmain(){std::functionf=[](intx){returnx;};std::functiong=f;std::cout为什么赋值g=f;是允许的? 最佳答案 考虑重写等效代码以避免lambda或std::function:intf(intx){returnx;}intconst&g(intconst&x){returnf(x);}这是一个结构良好的代码,尽管如此,它仍会返回一个对

c++ - clang,返回带有类型转换的 std::unique_ptr

这是我的代码:#includestructA{};structB:A{};std::unique_ptrtest(){autop=std::make_unique();returnp;}intmain(intargc,char**argv){test();return0;}它不会在clang上编译并出现错误:main.cpp:11:12:error:noviableconversionfromreturnedvalueoftype'unique_ptr>'tofunctionreturntype'unique_ptr>'然而,根据this(同样的情况)应该。我是不是误会了什么?我的命令

c++ - 从 Qt 5.6 切换到 Qt 5.7 - 命名空间 std 中的 "no member ' make_unique'

我有一个CMakeQt项目,它使用了多个c++14功能,包括std::make_unique。通常这将通过以下方式处理:LIST(APPENDCMAKE_CXX_FLAGS-std=c++14)或ADD_COMPILE_OPTIONS(-std=c++14)我想将项目从5.6版升级到5.7版,但在测试构建期间出现多次失败并出现错误nomember'make_unique'innamespacestd我已验证所有适当的header和编译选项都已到位,并排除了任何环境问题。使用Qt5.7绝对是个问题。有什么解决方法吗? 最佳答案 原来这

c++ - std::numeric_limits<double>::epsilon() 在 Visual C++ 2015 中未定义

以下代码产生错误:std::numeric_limits::epsilon()未定义的错误。使用numeric_limits::epsilon也会产生此错误。#ifndef_USE_MATH_DEFINES#define_USE_MATH_DEFINES#endif//!_USE_MATH_DEFINES#include#includeclassplusCartesianPoly{public:staticboolisClose(doublea,doubleb){if(fabs(a-b) 最佳答案 numeric_limits在li