Tag: 元编程

通过元编程缓解C ++到Objective-C /cocoa桥接?

在一个纯粹的C ++世界中,我们可以在编译时间使用基于模板的编译时和运行时技术(例如,大部分自动将marshall传入或传出使用传统types的调用)的组合,在不同的组件或接口之间生成接口或粘合代码。 当需要将Objective-C / Cocoa与GUI,系统集成或IPC接口的C ++应用程序进行交互时,由于input较不严格,事情变得更加困难 – 但是通常不会再需要一个扁平的重复接口层:瘦桥接代表必须定义或转换代码语言桥接调用必须写。 如果您必须处理非平凡大小的接口,并且希望避免基于脚本的代码生成,那么这很快就会变得繁琐,而且每次重构都必须发生,这只是一个痛苦。 使用(模板)元编程和Objective-C运行时库的组合,应该可以大大减less代码量… 在我重新发明轮子(可能浪费时间)之前 ,有没有人知道在这个方向上的技术,最佳实践或例子? 举一个例子,假设我们需要一个支持这个非正式协议的委托: – (NSString*)concatString:(NSString*)s1 withString:(NSString*)s2; – (NSNumber*) indexOf:(CustomClass*)obj; 而不是实现一个明确桥接到C ++实例的Obj-C类,我想这样做,而不是: class CppObj { ObjcDelegate m_del; public: CppObj() : m_del(this) { m_del.addHandler <NSString* (NSString*, NSString*)> ("concatString", &CppObj::concat); m_del.addHandler <NSNumber* (CustomClass*)> ("indexOf", &CppObj::indexOf); } std::string concat(const std::string& s1, const std::string& s2) { return s1.append(s2); } size_t […]

如何通过reflection获取由Ruby的Module类定义的常量?

我试图让Matz和Flanagan的“Ruby编程语言”元编程章节进入我的脑海,但是我无法理解我梦寐以求的代码片段的输出: p Module.constants.length # => 88 $snapshot1 = Module.constants class A NAME=:abc $snapshot2 = Module.constants p $snapshot2.length # => 90 p $snapshot2 – $snapshot1 # => ["A", "NAME"] end p Module.constants.length # => 89 p Module.constants – $snapshot1 # => ["A"] p A.constants # => ["NAME"] 本书指出类方法constants返回类的constants列表(正如你可以在A.constants的输出中看到的A.constants )。 当我遇到上述奇怪的行为时,我试图获取为Module类定义的常量列表。 A的常量显示在Module.constants中。 如何获得Module类定义的常量列表? 文档状态 Module.constants返回系统中定义的所有常量。 包括所有类和方法的名称 由于A从Module.constantsinheritance它的实现,它在基类和派生types中的行为有什么不同? […]

在Ruby中将一个实例variables添加到一个类中

我如何在运行时将实例variables添加到已定义的类,然后从类外部获取并设置其值? 我正在寻找一个元编程解决scheme,允许我在运行时修改类实例,而不是修改最初定义类的源代码。 一些解决scheme解释了如何在类定义中声明实例variables,但这不是我所问的。

GCC错误与可变参数模板:“对不起,未实现:不能扩展'标识符…'到一个固定长度的参数列表”

在GCC的C ++ 11中进行可变模板编程时,偶尔会遇到一个错误,提示“对不起,未实现:无法将”标识符…“扩展为固定长度的列表。 如果我删除代码中的“…”,那么我会得到一个不同的错误:“错误:参数包不能用'…'扩展。 所以如果我有“…”,GCC会调用这个错误,如果我把“…”取出,GCC也会调用这个错误。 我已经能够处理这个问题的唯一方法是从头开始用一种不同的方法完全重写模板元程序,并且(幸运的是)我最终得到了不会导致错误的代码。 但我真的想知道我做错了什么。 尽pipe谷歌search,尽pipe进行了大量的实验,我不能确定我做了不同的模板代码之间产生这种错误,和没有错误的代码。 错误信息的措辞似乎意味着代码应该按照C ++ 11标准工作,但是GCC目前还不支持它。 或者,也许这是一个编译器错误? 这是一些产生错误的代码。 注意:我不需要你为我写一个正确的实现,而只是指出我的代码是什么导致了这个特定的错误 // Used as a container for a set of types. template <typename… Types> struct TypePack { // Given a TypePack<T1, T2, T3> and T=T4, returns TypePack<T1, T2, T3, T4> template <typename T> struct Add { typedef TypePack<Types…, T> type; }; }; […]

在Ruby中未定义variables

假设我正在使用irb ,并键入a = 5 。 如何删除a的定义,以便键入a返回一个NameError ? 一些背景:后来我想这样做: context = Proc.new{}.binding context.eval 'a = 5' context.eval 'undef a' # though this doesn't work.

在拟抽样中“准”的含义是什么?

一些像Haskell(或Nemerle)这样的语言有quasiquotations 。 我不知道“准”是什么意思,如果没有“准”部分也存在“引用”。

我如何dynamic创build一个类的python类方法

如果我定义一个小Python程序 class a(): def _func(self): return "asdf" # Not sure what to resplace __init__ with so that a.func will return asdf def __init__(self, *args, **kwargs): setattr(self, 'func', classmethod(self._func)) if __name__ == "__main__": a.func 我收到跟踪错误 Traceback (most recent call last): File "setattr_static.py", line 9, in <module> a.func AttributeError: class a has no attribute 'func' 我想弄清楚的是,我怎样才能dynamic地将类方法设置为一个类,而不需要实例化一个对象呢? 编辑: […]

在运行时获取模板元编程时间常量

背景 考虑以下: template <unsigned N> struct Fibonacci { enum { value = Fibonacci<N-1>::value + Fibonacci<N-2>::value }; }; template <> struct Fibonacci<1> { enum { value = 1 }; }; template <> struct Fibonacci<0> { enum { value = 0 }; }; 这是一个常见的例子,我们可以将斐波那契数的值作为编译时常量: int main(void) { std::cout << "Fibonacci(15) = "; std::cout << Fibonacci<15>::value; std::cout << […]

基于constexpr的计算图灵完成?

我们知道C ++模板元编程是图灵完备的 ,但是预处理元编程不是 。 C ++ 11为我们提供了一种新的元编程forms:计算constexpr函数。 这种计算forms是否是图灵完成的? 我在想,因为recursion和条件运算符(?:)在constexpr函数中是允许的,但是我希望有更多专业知识的人来确认。

删除/取消定义类方法

你可以像下面这样为一个类dynamic地定义一个类方法: class Foo end bar = %q{def bar() "bar!" end} Foo.instance_eval(bar) 但是,你如何做相反的: 删除/取消定义类方法? 我怀疑模块的remove_method和undef_method方法可能可以用于这个目的,但所有我看到谷歌search了几个小时后的例子是去除/定义实例方法,而不是类方法。 或者也许有一种语法可以传递给instance_eval来做到这一点。 提前致谢。