标签: metaprogramming

C++ SFINAE的例子?

我想进入更多的模板元编程.我知道SFINAE代表"替换失败不是错误".但是有人能告诉我SFINAE的用处吗?

c++ templates metaprogramming sfinae

113
推荐指数
6
解决办法
4万
查看次数

C++模板元编程的最佳介绍?

静态元编程(又名"模板元编程")是一种很棒的C++技术,它允许在编译时执行程序.一读到这个规范的元编程示例,一个灯泡在我脑海中消失了:

#include <iostream>
using namespace std;

template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };

template<>
struct factorial< 0 > { enum { ret = 1 }; };

int main() {
    cout << "7! = " << factorial< 7 >::ret << endl; // 5040
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果想要了解更多关于C++静态元编程的知识,那么最好的来源是什么(书籍,网站,在线课件,等等)?

c++ templates metaprogramming

112
推荐指数
6
解决办法
6万
查看次数

元编程究竟是什么?

我正在阅读关于Java平台ployglot编程的 TheServerSide上的一篇文章.文章中的一些评论将元编程称为生成代码的能力(可能即时).

元编程能否动态生成代码,或者是在运行时将方法和属性注入现有对象的能力(就像Python,Ruby和Groovy等动态语言允许的那样).

metaprogramming

110
推荐指数
7
解决办法
5万
查看次数

小马(ORM)如何做其伎俩?

Pony ORM做了将生成器表达式转换为SQL的好方法.例:

>>> select(p for p in Person if p.name.startswith('Paul'))
        .order_by(Person.name)[:2]

SELECT "p"."id", "p"."name", "p"."age"
FROM "Person" "p"
WHERE "p"."name" LIKE "Paul%"
ORDER BY "p"."name"
LIMIT 2

[Person[3], Person[1]]
>>>
Run Code Online (Sandbox Code Playgroud)

我知道Python内置了精彩的内省和元编程,但是这个库如何能够在不进行预处理的情况下转换生成器表达式?它看起来像魔术.

[更新]

Blender写道:

这是你要追求的文件.它似乎使用一些内省魔法重建了生成器.我不确定它是否支持100%的Python语法,但这非常酷.- 搅拌机

我在想他们正在探索生成器表达式协议的一些功能,但是查看这个文件,并看到所ast涉及的模块......不,他们不是在动态检查程序源,是吗?令人兴奋...

@BrenBarn:如果我尝试在select函数调用之外调用生成器,结果是:

>>> x = (p for p in Person if p.age > 20)
>>> x.next()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<interactive input>", line 1, in <genexpr>
  File "C:\Python27\lib\site-packages\pony\orm\core.py", …
Run Code Online (Sandbox Code Playgroud)

python orm dsl metaprogramming ponyorm

108
推荐指数
1
解决办法
1万
查看次数

如何使用define_method创建类方法?

如果您尝试以元编程方式创建类方法,这将非常有用:

def self.create_methods(method_name)
    # To create instance methods:
    define_method method_name do
      ...
    end

    # To create class methods that refer to the args on create_methods:
    ???
end
Run Code Online (Sandbox Code Playgroud)

我的回答是......

ruby metaprogramming class-method

106
推荐指数
5
解决办法
4万
查看次数

编译时间字符串散列

我在几个不同的地方读过,使用C++ 11的新字符串文字,可以在编译时计算字符串的哈希值.然而,似乎没有人准备出来说它将是可能的或如何完成.

  • 这可能吗?
  • 操作员会是什么样子?

我特别感兴趣的是这样的用例.

void foo( const std::string& value )
{
   switch( std::hash(value) )
   {
      case "one"_hash: one(); break;
      case "two"_hash: two(); break;
      /*many more cases*/
      default: other(); break;
   }
}
Run Code Online (Sandbox Code Playgroud)

注意:编译时哈希函数不必像我编写的那样完全.我尽力猜测最终解决方案的样子,但meta_hash<"string"_meta>::value也可能是一个可行的解决方案.

c++ hash metaprogramming c++11

95
推荐指数
10
解决办法
4万
查看次数

根据名称获取实例变量的值

一般来说,如何获取对字符串中名称的对象的引用?

更具体地说,我有一个参数名称列表(成员变量 - 动态构建,所以我不能直接引用它们).

每个参数都是一个也有from_s方法的对象.

我想做类似以下的事情(当然这不起作用......):

define_method(:from_s) do | arg |
    @ordered_parameter_names.each do | param |
        instance_eval "field_ref = @#{param}"
        field_ref.from_s(param)
    end
end
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming

94
推荐指数
2
解决办法
8万
查看次数

如何根据名称动态调用方法?

当名称包含在字符串变量中时,如何动态调用方法?例如:

class MyClass
  def foo; end
  def bar; end
end

obj = MyClass.new
str = get_data_from_user  # e.g. `gets`, `params`, DB access, etc.
str  #=> "foo"
# somehow call `foo` on `obj` using the value in `str`.
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?这样做是否存在安全风险?

ruby metaprogramming dynamic

94
推荐指数
5
解决办法
7万
查看次数

如何将Ruby类名转换为下划线符号?

如何以编程方式将类名FooBar转换为符号:foo_bar?像这样的东西,但是正确处理骆驼的情况?

FooBar.to_s.downcase.to_sym
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming ruby-on-rails

90
推荐指数
3
解决办法
4万
查看次数

Ruby Metaprogramming:动态实例变量名称

假设我有以下哈希:

{ :foo => 'bar', :baz => 'qux' }
Run Code Online (Sandbox Code Playgroud)

如何动态设置键和值以成为对象中的实例变量...

class Example
  def initialize( hash )
    ... magic happens here...
  end
end
Run Code Online (Sandbox Code Playgroud)

...所以我最终在模型中得到以下内容......

@foo = 'bar'
@baz = 'qux'
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming instance-variables

90
推荐指数
4
解决办法
4万
查看次数