草庐IT

c++ - 为继承 enable_shared_from_this 的类获取 unique_ptr

通常我更喜欢从工厂返回unique_ptr。最近我遇到了为继承enable_shared_from_this的类返回unique_ptr的问题。此类的用户可能会意外调用shared_from_this(),尽管它不属于任何shared_ptr,这会导致std::bad_weak_ptr异常(或C++17之前的未定义行为,通常作为异常实现)。代码的简单版本:classFoo:publicenable_shared_from_this{stringname;Foo(conststring&_name):name(_name){}public:staticunique_ptrcreate(c

c++ - 函数指针引用参数转换为const

示例代码:classFoo;typedefvoid(*fnptr)(Foo&foo);fnptrgFn;voidmyfoo(constFoo&foo){}intmain(){gFn=&myfoo;}使用clang失败并出现以下错误:main.cpp:9:9:error:assigningto'fnptr'(aka'void(*)(Foo&)')fromincompatibletype'void(*)(constFoo&)':typemismatchat1stparameter('Foo&'vs'constFoo&')gFn=&myfoo;^~~~~~~1errorgenerated.G

c++ - Pimpl Idiom 的嵌套名称说明符中使用的不完整类型

我有以下代码的错误incompletetype‘Foo::Pimpl’usedinnestednamespecifier另一个Foo.hppstructAnotherFoo{voidmethodAnotherFoo(Foo&);};另一个Foo.cpp#include"Foo.hpp"#include"AnotherFoo.hpp"voidAnotherFoo::methodAnotherFoo(Foo&foo){//hereiwanttosavethefunctionpointerofmethodPimpl(),std::functionforex:std::functionfn=s

c++ - 有没有办法禁用非动态类构造函数?

这个问题在这里已经有了答案:Isitpossibletopreventstackallocationofanobjectandonlyallowittobeinstantiatedwith'new'?(6个答案)关闭4年前。想象一个只能用new运算符构造的类。是否可以在不删除其析构函数的情况下在c++17标准中实现这一点?classFoo{Foo(){}~Foo(){}//deletenon-dynamicconstructor...?}//...FooA;//compilingerrorFoo*B=newFoo();//ok

c++ - 为什么尽管使用了 -isystem,但 clang 在我的标题上报告了警告,而 gcc 没有报告?

与thisquestion稍微相关但不一样。在ArchLinux上使用clang7.0.1。我喜欢干净的代码,所以我想启用所有警告并将它们视为错误。问题是我的构建中有一些自动生成的文件不是没有警告,例如:生成/foo.hinlinevoidfoo(intunused){//warning:unusedparameter'unused'}生成/foo.cc#include"foo.h"//Thereisactualcodehere,butitdoesn'tmatter.由于这些文件是由第三方工具生成的,我不能轻易修改它们,所以我使用-isystem禁止来自generated的所有警告目录

c++ - const 指向成员的指针是否默认指向一个 int?

在玩指向成员的指针时,我遇到了一种似乎有点不一致并且对我来说有点违反直觉的行为。考虑以下虚拟结构:structfoo{intx;doubled;};和以下main():intmain(){intfoo::*ptr=&foo::x;doublefoo::*ptr2=&foo::d;}这里我们没有任何异常-两个指向const成员的指针。代码编译正常。引起我注意的是,当我们添加const时,情况发生了一点变化。考虑以下代码:intmain(){//nointordoubleafterconstconstfoo::*ptr=&foo::x;}代码在GCC8.2.01上编译良好。请注意,我没有指

C++ 宏算术

我必须处理宏(它是宏调用宏;所以模板是不可能的)。这是我想要的:foo(3,a,b1,c1)-->foo1(a,b1,c1);foo(5,a,b1,c1,b2,c2)->foo2(a,b1,c1,b2,c2);foo(7,a,b1,c1,b2,c2,b3,c3)->foo3(a,b1,c1,b2,c2,b3,c3);所以基本上,我想要的是能够在宏展开时执行“函数”n->(n-1)/2。这可能吗?[PS,如果你不喜欢我的问题;我支持你投反对票的权利;到目前为止我最糟糕的问题只有-17,所以也许我们可以打破这个记录;但是,请告诉我为什么我的问题在技术上是无效的。]编辑:Foo接受一个可变参

c++ - CMake 选项禁用特定平台特定文件的编译

我正在使用CMake来定义我的项目。我的目标是让特定于平台的文件易于访问,以便在所有平台上进行编辑、搜索、浏览和源代码控制。我目前在cmake描述中分隔了特定于平台的文件。我的CMakeLists.txt文件如下所示:Foo.hpp${platform_directory}/Foo.cpp然后在磁盘上我有这样的东西:Foo.hppwin`-Foo.cpposx`-Foo.cpp生成的项目文件如下所示:Foo.hppFoo.cpp(platform-specificversion)这对于编译器来说是完美的,但这意味着开发人员缺少用于非本地平台特定文件的IDE工具。我正在寻找的是这样的东西

C++ 对重载函数的奇怪模棱两可的调用

这个问题在这里已经有了答案:Whatis"Argument-DependentLookup"(akaADL,or"KoenigLookup")?(4个答案)关闭9年前。首先,这个问题纯属理论性质。我不是在寻找解决方案(我已经知道了),我只是在寻找解释。以下代码无法编译:structfoo{};voida(foo){}namespacefoobar{voida(foo){}voidb(foof){a(f);}}intmain(){return1;}MSVC++:1>c:\projects\codetests\main.cpp(7):errorC2668:'foobar::a':ambig

python - swig:扩展类模板以提供 __str__

假设你有一个模板类Foo,你想用Swig透明地包装它以便打印类:>>>fromexampleimport*>>>f=Foo2()>>>print(f)InFooclass!我关注了thispost和thisone.所以我的头文件是:#includetemplateclassFoo{public:friendstd::ostream&operator还有我的界面文件:%{#include#include#include"foo.hpp"%}%include"std_iostream.i"//Trygrabbingitunmodified%include"foo.hpp"/*Instant