草庐IT

c++ - 我可以将 CRTP 与虚函数或仿函数一起用于访问者算法以容忍类的更改吗

我正在重写编译器的IR,其中IR类和算法都在不断变化。当前编译器至少有2个当前IR,它们用于我要合并的不同阶段。首先,我们有一个AST层次结构,它基于一个Node抽象基类和一个与之关联的访问者模式。接下来,我们有一个单独的语义层次结构,它使用各种类(我可能可以全部rebase,这样Node也是所有类的最低级别)。随着我们认识到更多的特化,语义层次可能会增长。这些类有一个单独的访问者模式。为执行生成的程序创建了2个“可执行”IR。我的目标是合并AST和语义层次结构,并合并它们生成的可执行形式。这将减少由于两种形式的不一致而导致的错误数量。但是,正如我所指出的,语义层次结构很可能会添加新的

c++ - 我可以从 C++ 库中包含/导入单个函数吗

我只需要使用iequals来自BOOST库的不区分大小写的字符串比较函数。我正在使用#include导入它。有什么方法可以让我只导入iequals自己发挥作用?我什至关心的原因(我真的只是好奇。)是因为如果我不这样做,编译的DLL大约是230kB#include它和大约1.1MB,如果我这样做的话。在这种特殊情况下,文件有多大并没有太大区别,但似乎有很多东西被导入但从未使用过。如果库只有几GB而我只需要其中一个函数怎么办?我想这会成为一个问题。当谈到几乎所有与cpp相关的事情时,我承认我很天真,但我觉得包含大约750kB的代码并不是很有效,因为其中可能有90%的代码都没有被使用。可能是

c++ - 我可以将 Visual C++ 运行时切换到另一个堆吗?

我的程序使用了第三方动态链接库,里面有大量内存泄漏。我的程序和库都是VisualC++native代码。两者都动态链接到VisualC++运行时。我想强制库进入另一个堆,以便在库代码运行时通过VisualC++运行时完成的所有分配都在该堆上完成。我可以调用HeapCreate(),然后调用HeapDestroy()。如果我以某种方式确保所有分配都在新堆中完成,我就不再关心泄漏-当我销毁第二个堆时它们都会消失。是否可以强制VisualC++运行时在指定的堆上进行所有分配? 最佳答案 抱歉,我的最后一个回答半生不熟,我按了Tab键并输入

c++ - 我可以重载 CArchive << 运算符以使用 std::string 吗?

我在我的MFC应用程序中使用std::string,我想将它存储在文档的Serialize()函数中。我不想将它们存储为CString,因为它在那里写了自己的东西,我的目标是创建一个我知道其格式并且可以被其他应用程序读取而无需CString的文件。所以我想将我的std::strings存储为4字节(int)字符串长度,后跟包含该字符串的该大小的缓冲区。voidCMyDoc::Serialize(CArchive&ar){std::stringtheString;if(ar.IsStoring()){//TODO:addstoringcodehereintsize=theString.s

c++ - 我可以有条件地替换预处理器参数吗?

在使用单元测试框架时,我遇到了一种情况,我想在其中测试宏参数。简单地说,我想扩展宏FOO(x)这样FOO(int)将是short和FOO(anything_else)将是long。有了C++模板,这当然不是问题。但在这里我需要一个真正的token替换,而不仅仅是typedef。IE。FOO(char)FOO(char)i;应该是等于longlongi;的有效定义。 最佳答案 据我所知,C宏中唯一可用的类似字符串的操作是粘贴/连接标记(使用##),以及将它们字符串化(使用#).我很确定你最接近的是像这样列举可能性:#defineFOO

c++ - 我可以在 MFC 中有多个 GUI 线程吗?

我有一个基于MFC的大型应用程序,它在主线程中包含一些可能非常慢的任务。这可以使应用程序看起来像是挂起,而实际上它正在完成一项长时间的任务。从可用性的角度来看,我想为用户提供更多有关进度的反馈,并可以选择以干净的方式中止任务。虽然将长期任务分散到单独的线程中将是一个更好的长期解决方案,但我认为实用的短期解决方案是创建一个新的GUI线程,封装在它自己的对象中,并带有包含进度条和取消按钮的对话框,用于类似于CWait对象的方式。主线程通过IsCancelled方法监控取消状态,并在需要时通过抛出结束。这是一种合理的方法吗?如果是的话,是否已经有一些MFC代码可供我使用,或者我应该自己编写?

c++ - 我可以只用事件、互斥量和信号量实现公平的 "wait on multiple events"吗?

在只有事件[1]、互斥锁和信号量[2]的平台上,我可以创建一个公平的“等待多个事件”实现,当任何事件[3]发出信号/设置时返回。我假设现有的原语是公平的。[1]事件是具有4个操作的“标志”:Set()、Clear()、Wait()和WaitAndClear()。如果你在一个未设置的事件上等待(),你会阻塞直到有人设置()它。WaitAndClear()听起来像,但是原子的。所有服务员都被唤醒。[2]我认为系统不支持负值的信号量。[3]我说的是“事件”,但它可能是使用任何这些原语的新对象类型。 最佳答案 对于window,WaitFo

java - 我可以在不编译的情况下获得 C/C++/Java 代码的 XML AST 吗?

我想用源代码的AST表示创建一个XML文件,但不编译它。到目前为止,我没有找到任何足够的解决方案。这是我尝试过的:在clang中使用XML打印机-clang-cc1-ast-print-xml-这很好,但它是removedfromclangsrcML工具包,理论上运行良好,但解析器较差(对于Java,它甚至不完全兼容1.5)还有其他选择吗? 最佳答案 对于Java,请参阅WhatwouldanAST(abstractsyntaxtree)foranobject-orientedprogramminglanguagelooklike?

c++ - 我可以安全地使用#ifdef 来了解是否包含 c++ std header 吗?

首先,我读过这个问题:Isthereawaytodetectportablythatastandardheaderisincludedusingmacros?我想知道的是:使用#ifdef检测是否包含c++stdheader的安全性如何,如下面的代码所示:namespaceoverwrite{usingbyte=unsignedchar;templatevoidwithZeros(generic*toBeOverwriten,size_tlength=1){//dostuff}#ifdef_GLIBCXX_RANDOM//foundthismacroinsidetemplatevoid

c++ - 我可以使用 decltype() 来避免显式模板实例化中的代码重复吗?

我有一个很长的模板函数声明:templatevoidfoo(lotsofargs,goinhere,andevenmore,ofthesearguments,theyjust,dontstop);没有重载。我想显式实例化它。我可以写(比如T=int):templatevoidfoo(lotsofargs,goinhere,andevenmore,ofthesearguments,theyjust,dontstop);但我真的不想复制那么长的声明。我希望喜欢能够说出类似的话:templateusingbar=decltype(foo);然后:templatebar;现在,第一行编译(GC