jjzjj

.net - 我应该如何用 C++ 编写我的库以便在 .NET 中使用?

我有一个用C++编写的库的原型(prototype)。它是CPU密集型的,所以我用C编写了一个部分(因为工具),C++中的内容并使用了自定义内存分配器和各种东西。我想在.NET中使用这个库。我不确定我应该怎么做。似乎我应该编写一个C接口(interface)并在.NET中编写一个包装器以使用托管C++,我假设我有完全相同的代码文件,除了我添加一个或两个文件并为它们编写一个托管类。如果我选择托管路线,我应该了解哪些好处或限制? 最佳答案 C++/CLI是您正在寻找的答案。C++/CLI的美妙之处在于它允许您将nativeC++与.NE

c++ - 成员访问和模板特化

我有这个类模板templateclassWrapper{public:virtualvoidparse(std::strings)=0;protected:Tvalue;};理想情况下,每种类型都应该知道如何从字符串中解析自身,所以我想有,例如,专门化templateclassWrapper{public:virtualvoidparse(std::strings){value=atoi(s.c_str());}};但是,显然,我无法从主模板访问“值”成员。我得到的是这样的:Inmemberfunction'virtualvoidWrapper::parse(std::string)'

c++ - 类 std::array of objects without default constructors

所以让我们假设我有以下类(class)classNoDefaultConstructor{NoDefaultConstructor()=delete;...};我还有另一个类,它有一个类型为NoDefaultConstructor和其他成员的数组classWrapper{std::arrayarr;...};如何在Wrapper的构造函数中初始化数组(可能在使用std::intializer_list的初始化列表中)?更具体地说,是我可以将参数传递给Wrapper的初始化列表中的数组构造函数以具有类似于以下的构造的唯一方法吗?我正在考虑这样做,因为将来数组的大小可能会发生变化。temp

c++ - std::reference_wrapper *this 周围

我有一个场景,我需要转换一个可以被*this链接的函数返回std::optional>而不是T&(原因超出了这个问题的范围)。我使用std::reference_wrapper的原因是因为std::optional不能引用,至少在C++11中不能。但是,这不起作用,因为我似乎遇到了终身问题。这是一个最小的例子:#include#includestructtest{std::reference_wrapperfoo(){val=42;return*this;}test&foo2(){val=50;return*this;}intval;};voidbar(testt){std::cout

c++ - 为 std::unordered_map 中的 const std::reference_wrapper 重载 operator==

我不知道如何使用std::reference_wrapper将std::string引用获取到std::unordered_map中>。根据以下链接,我知道我需要重载operator==。Whycantemplateinstancesnotbededucedin`std::reference_wrapper`s?但是,我不知道如何编写operator==以使其采用conststd::reference_wrapper。如果包装器不是const,那将不是问题。使用char而不是std::string效果很好(不需要重载operator==)。代码:#include#include#inc

c++ - 是否可以显式特化模板以匹配 lambda?

假设我有一个headerwrapper.h:templatevoidwrapper(constFuncfunc);和一个文件wrapper.cpp包含:#include"wrapper.h"templatevoidwrapper(constFuncfunc){func();}还有一个文件main.cpp包含:#include"wrapper.h"#includeintmain(){wrapper([](){std::cout如果我将这些一起编译(例如,catwrapper.cppmain.cpp|g++-std=c++11-omain-xc++-),我没有收到链接器错误。但是如果我单独

c++ - 结构化异常情况下的堆栈展开

这个问题更清楚地描述了here所描述的问题.我做了更多调查,发现堆栈展开并没有发生在以下代码段中:classOne{public:intx;};classWrapper{public:Wrapper(CStringcsText):mcsText(csText){CStringcsTempText;csTempText.Format("Wrapperconstructor::%s\n",mcsText);OutputDebugString(csTempText);}~Wrapper(){CStringcsTempText;csTempText.Format("Wrapperdestruc

c++ - 是否有用于 C 字符串的标准 C++ 迭代器?

有时我需要使用通用C++迭代器范围接口(interface)[first,last)将C字符串传递给函数。是否有适用于这些情况的标准C++迭代器类,或无需复制字符串或调用strlen()的标准方法?编辑:我知道我可以使用指针作为迭代器,但我必须知道字符串在哪里结束,我需要调用strlen()。编辑2:虽然我不知道这样的迭代器是否标准化,但我当然知道这是可能的。回应讽刺的回答和评论,这是stub(不完整,未经测试):classCStringIterator{public:CStringIterator(char*str=nullptr):ptr(str){}booloperator==(

c++ - 模板区域中的不可推导上下文

templatestructWrap{Wrap(T*p){}};#ifdefTEMPLATEtemplatevoidfoo(Wrapt){}//version-1#elsevoidfoo(Wrapp){}//version-2#endifintmain(){foo(newint);}编译#else部分时,编译正常并选择了version-2。如果我尝试编译#ifdef部分,我希望应该选择版本1。但是编译器给出错误,error:nomatchingfunctionforcallto`foo(int*)'我是否触及了templatefoo的不可推导部分?如果是,那么谁能阐明不可推导区域的确切

c++ - std::reference_wrapper 何时转换为 T&?

考虑以下代码:#include#includeusingnamespacestd;templatevoidfun(Tt){t+=8;}intmain(){inti=0;fun(ref(i));cout此代码打印“8”。我假设fun()中的t自动转换为int&。但是如果我用t=8替换t+=8,程序将无法编译。为什么? 最佳答案 reference_wrapper有一个到T&的隐式转换运算符,所以它会被转换成T&无论哪里T&是比reference_wrapper更好的匹配.在扩充赋值表达式中,唯一可行的运算符是int&operator+