小编Eld*_*ese的帖子

如何从用户输入修改C++代码

我目前正在编写一个位于C++解释器之上的程序.用户在运行时输入C++命令,然后将其传递给解释器.对于某些模式,我想用修改后的表单替换给出的命令,以便我可以提供其他功能.

我想替换任何形式的东西

A->Draw(B1, B2)
Run Code Online (Sandbox Code Playgroud)

MyFunc(A, B1, B2).
Run Code Online (Sandbox Code Playgroud)

我首先想到的是正则表达式,但是这将是相当容易出错,因为任何的A,B1或者B2可以是任意的C++表达式.由于这些表达式本身可能包含带引号的字符串或括号,因此将所有情况与正则表达式匹配将非常困难.此外,此表达式可能有多种嵌套形式

我的下一个想法是将clang称为子进程,使用"-dump-ast"获取抽象语法树,修改它,然后将其重建为一个命令以传递给C++解释器.但是,这需要跟踪任何环境更改,例如包含文件和转发声明,以便为clang提供足够的信息来解析表达式.由于口译员没有公开这些信息,这似乎也是不可行的.

第三个想法是使用C++解释器自己的内部解析转换为抽象语法树,然后从那里构建.但是,这个解释器不会以任何我能够找到的方式揭示ast.

是否有任何关于如何继续进行的建议,无论是沿着其中一条规定的路线,还是完全沿着不同的路线?

c++ clang root-framework

19
推荐指数
1
解决办法
1615
查看次数

相互依赖的C++类,由std :: vector持有

我很好奇是否可以创建两个类,每个类都包含std::vector另一个类.我的第一个猜测是,这是不可能的,因为std::vector需要一个完整的类型,而不仅仅是一个前向声明.

#include <vector>

class B;
class A { std::vector<B> b; };
class B { std::vector<A> a; };
Run Code Online (Sandbox Code Playgroud)

我认为声明std::vector<B>会立即导致失败,因为B此时类型不完整.但是,这在gcc和clang下成功编译,没有任何警告.为什么这不会导致错误?

c++ vector

12
推荐指数
1
解决办法
336
查看次数

boost :: serialize,测试对象是否可序列化

我试图编写一个使用boost :: serialize的函数,如果一个对象可以被序列化,如果该对象不能用boost :: serialize编写,则使用回退.是否有一些基于模板的方法来测试给定的类是否可以序列化?

 // ideally, something of this form
 is_boost_serializeable<T>::value
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用SFINAE来检查单个方法的存在,但是如何提供序列化的许多不同选项,我担心我会错过一些边缘情况.事实上,我还没有在boost文档中找到任何描述已经存在的这样一个函数的东西.

c++ boost boost-serialization

6
推荐指数
0
解决办法
224
查看次数

IPython.embed()不使用终端颜色

我将经常使用它IPython.embed()来检查运行代码的状态。在早期版本的IPython中,它可以正确确定终端(xterm)的颜色功能,并使用彩色文本。在最新版本的IPython(7.2.0)中,使用时仅显示黑白文本IPython.embed()

根据文档,我应该可以通过设置在默认配置文件中覆盖此默认值c.InteractiveShell.colors = 'Linux'。但是,此设置仅适用于IPython的独立实例,不适用于嵌入式会话。

我可以使用%colors Linuxmagic方法对每个实例进行更正。但是,这应该自动进行,而无需在每次嵌入后进行其他配置。

如果我通过ipython3直接运行来启动IPython的独立实例,那么将正确设置终端颜色。但是,这不是我最常用的工作流程的选项。

这是使用运行在Linux Mint 19(基于Ubuntu 18.04)上的python 3.5.2测试的。在PyPI上发生的第一个ipython版本是7.0.0版本。可用的先前版本6.5.0正确使用带有终端颜色IPython.embed()。目前,我已经恢复到6.5.0的最新工作版本,但是我想保持最新版本。

python ipython

4
推荐指数
2
解决办法
402
查看次数