草庐IT

c++ - 用纯虚拟类 copy-and-swap 成语

我正在尝试使用纯虚方法和“copy-and-swap”惯用法来实现虚类,但我遇到了一些问题。代码无法编译,因为我正在类A的赋值运算符中创建实例,其中包含纯虚方法。有没有办法使用纯虚方法和copyandswapidiom?classA{public:A(stringname):m_name(name){m_type="";}A(constA&rec):m_name(rec.m_name),m_type(rec.m_type){}friendvoidswap(A&lhs,A&rhs){std::swap(lhs.m_name,rhs.m_name);std::swap(lhs.m_type

c++ - 如何在 GCC 上创建 va_list?

我正在尝试转换一些代码,以便它也能在gcc上编译(现在,它只能在MSVC上编译)。我遇到的代码是伪格式化函数,它接受格式字符串和零个或多个参数作为输入(constchar*format,...)。然后它将处理一些占位符消耗一些参数,并将其余部分与动态生成的新va_list一起传递给vsprintf。这是生成新va_list的实际代码:char*new_args=(char*)malloc(sum);char*n=new_args;for(inti=0;i在我的辩护中,我没有也永远不会编写这段代码。事实上,我认为这是我一生中见过的最骇人听闻的事情之一。但是,这个函数非常复杂,非常古老,而

c++ - allocator.construct 循环是否等于 std::uninitialized_copy?

在此背景下T是某种类型并且allocator是该类型的分配器对象。默认情况下为std::allocator但这不一定是真的。我有一大块内存被allocator.allocate(n)获取了.我还有一个容器con的T对象(比如std::vector)。我想用T初始化那block内存对象。内存块的位置存储在T*data中。.这两个代码示例是否始终相同?#include//example1std::uninitialized_copy(con.begin(),con.end(),data)//example2std::vector::const_iteratorin=con.begin();

c++ - __has_trivial_copy 在 clang 和 gcc 中的行为不同。谁是对的?

std::is_trivially_copyable在这两个编译器中仍然不被支持(至少gcc4.6是这样)。但是两者都提供了做得很好的__has_trivial_copy指令。除非涉及到已删除的复制构造函数。structA{A(Aconst&)=delete;};__has_trivial_copy(A)在clang中返回1,在gcc中返回0。我正在研究标准,但找不到说明删除复制构造函数时类是否仍被视为可平凡复制的条款。谁是对的?我倾向于相信gcc是正确的,因为structA根本不可复制,更不用说可复制了。此外,有一个广泛的共识,即删除的复制构造函数可以被视为私有(private)声明

c++ - 错误 C4996 : 'std::_Copy_impl' : Function call with parameters that may be unsafe

我知道这个问题在SO中被问过很多次,但这是与其他问题的不同。CompilerError:FunctioncallwithparametersthatmaybeunsafeVisualStudioWarningC4996xutility(2227):warningC4996:'std::_Copy_impl'失败的代码片段DWORDdwNumberOfNames=pExportDirectory->NumberOfNames;LPDWORDdwNames=(LPDWORD)((LPBYTE)hDLL+pExportDirectory->AddressOfNames);std::vecto

c++ - 多个 va_end 调用的顺序是否重要?

我有以下代码:va_listva[2];va_start(va[0],fmt);va_start(va[1],fmt);process(fmt,va);va_end(va[0]);va_end(va[1]);我查看了各种站点以获取关于va_start和va_end的文档,他们只说va_end应该为每个调用va_start在调用函数返回之前。我不确定调用顺序是否重要。特别是,是va_end(va[0]);va_end(va[1]);在语义上与相同va_end(va[1]);va_end(va[0]);在上面的示例代码中? 最佳答案 C

c++ - boost 图 : How to copy the nodes and edges of a graph without copying properties?

我正在使用带有捆绑属性的boost图。在我建立第一棵引用树之后。我想要其他几棵具有相同结构和层次结构但具有不同顶点和边缘属性的树。我发现有一个copy_graph方法,但不知道如何使用它来实现我的目的。比如我先创建一个引用树,VertexProperty1和EdgeProperty1是bundledpropertiestypedefboost::adjacency_listGraph;Graphg1;经过一些处理,g1包含了一些顶点和边。然后我想要一个具有不同捆绑属性的复制树。typedefboost::adjacency_listGraph2;copy_graph(g1,g2,???

c++ - 为什么没有 boost::copy_on_write_ptr?

我刚看到this不错的写时复制指针实现。它看起来非常通用和有用,所以我的问题是:这样的类是否包含在任何C++工具包(boost、loki等)中?如果不是,我真的很想知道为什么,因为它是一个非常有用的习惯用法,而且显然通用实现似乎是可行的(就像我链接到的那个)。 最佳答案 关于这种可能性存在很多争论,并且至少有一个建议版本最终以auto_ptr形式出现,用于引用计数的COW指针。不幸的是,COW的时代已经过去了。使COW指针(或COW-whatever)线程安全会引入严重的问题performanceproblems.编辑:重读,我觉得

c++ - SBRM/RAII 用于 std::va_list/va_start()/va_end 使用

我的代码包含如下片段:std::va_listap;va_start(ap,msgfmt);snprintf_bufbuf;consttchar*msg=buf.print_va_list(msgfmt,ap);va_end(ap);它们很短,va_start()和va_end()靠得很近,所以它们不是什么大问题。两者之间的调用异常可能是一个问题(或不是?)。简单测试表明,不允许从没有省略号的函数中调用va_start()。从与va_start()不同的函数调用va_end()是否允许?基本上,我很好奇是否可以对这些调用使用SBRM/RAII习惯用法,即使必须手动调用va_start(

c++ - 使用 boost::copy_graph 从 grid_graph 复制到 adjacency_list

我正在使用boost图形库并尝试初始化MutableGraph以网格的形式开始生活。边缘会在以后的生活中添加和删除,所以我认为adjacency_list是正确的选择。我对BGL的阅读表明,用这些边缘初始化它的明智方法是利用boost::grid_graph通过使用boost::copy_graph从boost::grid_graph复制可以免费为我制作所有初始边缘。我认为这是有道理的-copy_graph来自VertexListGraph模型的拷贝到一个模型MutableGraph,这正是我所拥有的。我最初尝试使用copy_graph的双参数版本,带着模糊的希望,其余部分的默认值会发