草庐IT

包装类

全部标签

c++ - SWIG 包装库中 __cxa_allocate_exception 期间的段错误

在为Ruby开发一个SWIG封装的C++库时,我们在C++代码内的异常处理过程中遇到了无法解释的崩溃。我不确定重新创建问题的具体情况,但它首先发生在调用std::uncaught_exception期间,然后在一些代码更改后,移至__cxa_allocate_exception在异常构造期间。GDB和valgrind都没有提供任何有关崩溃原因的见解。我找到了几个类似问题的引用资料,包括:http://wiki.fifengine.de/Segfault_in_cxa_allocate_exceptionhttp://forums.fifengine.de/index.php?topic

c++ - 有没有一种方便的方法可以将 std::pair 包装为新类型?

我经常发现自己使用std::pair将两个相关量的逻辑分组定义为函数参数/返回值。一些示例:行/列、标签/值等。很多时候我真的应该滚动我自己的类(class),而不是仅仅使用std::pair。当事情开始崩溃时很容易看出——当代码中到处都是make_pair时,首先,其次,很难记住什么是什么——std::pair比类型Position传达更少的含义.您发现了将std::pair的功能封装在传达真实含义的类型中的最佳方法是什么?以下是我考虑过的一些事情:typedefstd::pairPosition;这至少在传递类型时为类型提供了一个有意义的名称,但类型不是强制的,它实际上仍然只是一对

c++ - 为什么通用 lambda 不能调用自己,但将它包装在一个类中允许它?

这是完整的例子:autocallSelf=[](auto&func){func(func);};classwrapper:publicdecltype(callSelf){usingbase=decltype(callSelf);public:wrapper():base(callSelf){}templatevoidoperator()(T&func){base::operator()(func);}};intmain(){//callSelf(callSelf);//Errorwrapperw;w(w);//OK,niceendlessrecursion}为什么用wrapper可以

c++ - 如何构建捕获所有异常的 C++ Dll 包装器?

正如标题所说,我们正在寻找一种方法来捕获一段C++代码中的所有异常,并将其包装在一个dll中。这样我们就可以屏蔽使用这个dll的应用程序,使其免受这个dll中发生的任何错误。但是,这在Windows下使用C++似乎是不可能的。例子:voidfunction(){try{std::list::iteratorfd_it;fd_it++;}catch(...){}}发生的异常不会被标准C++try/catchblock捕获,也不会被_set_se_translator()设置的任何SEH转换器函数捕获。相反,DLL崩溃,并且使用DLL的程序被中止。我们使用VisualC++2005编译,带

c++ - 从 Rcpp 中的包装方法返回自定义对象

我对Rcpp模块有以下问题:假设我在Rcpp模块中有两个类classA{public:intx;};classBpublic:Aget_an_a(){Aan_a();an_a.x=3;returnan_a;}};RCPP_MODULE(mod){usingnamespaceRcpp;class_("A").constructor().property("x",&A::get_x);class_("B).constructor().method("get_an_A",&get_an_a);}.现在编译失败,因为它不知道如何处理A的返回类型。我想我可以用Rcpp::Xptr做点什么,但是,

c++ - 一个 C++ 迭代器适配器,它包装和隐藏内部迭代器并转换迭代类型

玩弄了这个,我怀疑这是不可能的,但我想我会问专家。我有以下C++代码:classIInterface{virtualvoidSomeMethod()=0;};classObject{IInterface*GetInterface(){...}};classContainer{private:structItem{Object*pObject;[...othermembers...]};std::listm_items;};我想将这些方法添加到Container中:MagicIteratorBegin();MagicIteratorEnd();为了让调用者可以写:Containerc=[

c++ - 用于 OpenGL 对象的 RAII 包装器

我想为OpenGL对象(纹理、帧缓冲区等)编写一个简单的RAII包装器,我注意到所有glGen*和glDelete*函数共享相同的签名,所以我的第一次尝试是这样的:typedefvoid(__stdcall*GLGenFunction)(GLsizei,GLuint*);typedefvoid(__stdcall*GLDelFunction)(GLsizei,constGLuint*);templateclassGLObject{GLuintm_name;public:GLObject(){glGenFunction(1,&m_name);}~GLObject(){glDelFunct

c++ - 用 C 和 C++ 接口(interface)编写库,用哪种方式包装?

在准备一个库(我们称之为libfoo)时,我发现自己面临以下两难境地:我是否将其编写为带有C包装器的C++库:namespaceFoo{classBar{...};}/*SeparateCheader.#ifdef__cplusplusomittedforbrevity.*/extern"C"{typedefvoid*FooBar;FooBar*foo_bar_new(){returnnewFoo::Bar;}voidfoo_bar_delete(FooBar*bar){deletebar;}}或者将其编写为带有C++包装器的C库更好:/*foo/bar.h.Again,#ifdef_

c# - 包装包含 vector 的模板类时如何让 SWIG 应用模板?

我正在尝试使用SWIG包装(在C#中)一些包含模板类的c++代码,该模板类本身包装了std::vector.我在互联网上看到了有关如何为vector类型声明模板的各种引用资料,但无法使其与额外的抽象层一起使用。这就是我在interface.i文件中所做的,例如://interface.ifile%modulemyNamespaceWrapper%{#include"myVector.h"%}%include"myVector.h"%include"std_string.i"%include"std_vector.i"namespacestd{%template(vector_MyTyp

c++ - 一个一个地传递参数,或者将它们包装在一个数组、结构体或元组中

当将参数传递给函数时,我总是假设一个一个地传递参数与传递包裹在数组、结构或元组中的参数没有什么不同。然而,一个简单的实验表明我错了。以下程序当compiledwithGCC:inttest(inta,intb,intc,intd){returna+b+c+d;}inttest(std::arrayarr){returnarr[0]+arr[1]+arr[2]+arr[3];}structabcd{inta;intb;intc;intd;};inttest(abcds){returns.a+s.b+s.c+s.d;}inttest(std::tupletup){returnstd::ge