标签: metaprogramming

什么是反思,何时是一个好方法?

什么是反射?我阅读了关于这个主题的维基百科文章,我理解它是一种元编程,程序可以在运行时自行修改,但这意味着什么?在什么样的情况下这是一个好的方法,何时最好使用它?

reflection metaprogramming definition

17
推荐指数
2
解决办法
3149
查看次数

何时/为什么(如果有的话)我应该考虑进行通用编程/元编程

恕我直言,OOPS,设计模式是有道理的,我已经能够实际应用它们.

但是当谈到 Modern C++类的"泛型编程/元编程"时,我感到很困惑.

- 这是一种新的编程/设计范式吗?

- 它仅限于"图书馆开发"吗?如果没有,那么设计/编码情况需要使用元编程/泛型编程.

- 使用模板意味着我正在进行通用编程吗?

我在这个主题上搜索了很多,但没有完全掌握大图.另见这篇文章.


在阅读了这里的讨论之后,到目前为止,我确信(可能仍然不正确):

a)通用编程和元编程是两个不同的概念.

c++ templates metaprogramming generic-programming

17
推荐指数
4
解决办法
1910
查看次数

带有(class_eval,define_method)vs(instance_eval,define_method)的Ruby单例方法

ruby中的元编程非常棒,因为我经常使用它来模拟基于原型的编程,并快速编写原型解决方案来解决某些问题,以测试它们的可行性.所以我想知道以下代码之间是否存在任何本质区别:

(class << some_object; self; end).class_eval do
  define_method(:method_name) do ... method body ... end
end
Run Code Online (Sandbox Code Playgroud)

(class << some_object; self; end).instance_eval do
  define_method(:method_name) do ... method body ... end
end
Run Code Online (Sandbox Code Playgroud)

代码的两个版本定义一个单身方法,我还没有碰到任何东西,迫使我选择(instance_eval, define_method)在组合(class_eval, define_method)组合来定义一个单独的方法,我想知道是否有这两个之间有一些本质上的区别.

ruby metaprogramming

17
推荐指数
1
解决办法
4268
查看次数

通用编程与元编程

究竟有什么区别?似乎这些术语可以互换使用,但是阅读了Objective-c的维基百科条目,我遇到了:

除了C的过程编程风格之外,C++还直接支持某些形式的面向对象编程,泛型编程和元编程.

参考C++.显然他们有所不同?

programming-languages metaprogramming generic-programming

17
推荐指数
4
解决办法
6065
查看次数

了解class方法的method_added

我想在瞬间做一些魔术,并将类方法添加到某个类中.因此我尝试了以下方法:

module Magic
  def self.included(base)
    base.extend ClassMethods
  end  
  module ClassMethods
    def method_added(name)
      puts "class method '#{name}' added"
    end  
    def some_class_method
      puts "some class method"
    end  
  end  
end

class Foo
  include Magic
  def self.method_added(name)
    puts "instance method #{name} added"
  end  
end
Run Code Online (Sandbox Code Playgroud)

这种方法适用于实例方法,类方法失败.我怎么解决这个问题?有什么建议?

ruby dsl metaprogramming

17
推荐指数
1
解决办法
2244
查看次数

元编程:用一种语言X编写,用C#,PHP,Java,C等多种语言进行交叉编译

在所有项目中,我通过跨越这样的要求,我再也没几年完成的,但它似乎在纸上那么容易:写一个插件为许多知名的CMS的.

显然,每个插件系统(或扩展系统)都是不同的,这需要通过适配器模式的特定桥接代码.但核心应该写一次.我不希望WordPress用户使用PHP-Java桥,我不希望DotNetNuke用户使用.NET-Native桥(尽管这更容易构思).

我认为,核心应该在涵盖大多数CMS系统的三个主要领域中进行编译:

  • 本机,中间语言可以是C或C++.Target可以用作PHP扩展.
  • 基于.NET语言的MSIL/CIL
  • 基于Java的系统的Java字节代码

C#和Java相互之间的转换非常好,但C和C#要难得多.最终,可能会添加其他目标,以免在使用插件之前强制WordPress或WikiMedia用户安装扩展程序.

我确信这也是其他的.解决这些问题的常用方法是什么?我应该首先定义DSL并使用DMS或类似的转换吗?其他选择?

php c# java metaprogramming cross-compiling

17
推荐指数
1
解决办法
4771
查看次数

编译时断言用于字符串相等

这可以使用模板吗?

有两个字符串常量.它们来自不同模块中的定义.它们必须相等,否则如果它们不相等,我将引发编译时错误.我可以使用模板吗?

#define MY_STRING "foo"
CompileAssertIfStringsNotEqual(MY_STRING, HIS_STRING);
Run Code Online (Sandbox Code Playgroud)

PS我被假设"abc"[0]是常量表达式而被欺骗.它不是.在语言中奇怪的遗漏.如果"abc"[0]是constand表达式,那将是可能的.

c++ templates metaprogramming

17
推荐指数
1
解决办法
4047
查看次数

如何确定可调用对象的函数签名?

在C++中有没有办法确定可调用对象的函数签名?

考虑以下:

template< typename F >
void fun(F f)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

让我们假设fun只用可调用的"东西"来调用它.

在里面fun我想知道什么是功能的签名f.这应该适用于函数指针,引用,包装器,lambdas,绑定,函数对象(假设它们只有一个operator ())等等.我受限于Visual Studio 2010 SP 1,但即使不使用该编译器,我也对标准解决方案感兴趣.

(函数签名Return_Type ([Arg1_Type [, Arg2_Type [, ... ] ] ]);与std::function/ boost::function.相同)

知道至少返回值的部分解决方案具有f一定的价值.(我已经尝试std::result_of但无论如何都无法让它工作.)

c++ metaprogramming

17
推荐指数
1
解决办法
5302
查看次数

C++/C++ 11 - 可变参数模板的switch语句?

假设我有一些像这样的结构:

struct MyStruct1 {

    inline void DoSomething() {
        cout << "I'm number one!" << endl;
    }

};

struct MyStruct2 {

    static int DoSomething() {

        cout << "I'm the runner up." << endl;
        return 1;

    }

};

struct MyStruct3 {

    void (*DoSomething)();

    MyStruct3() {
        DoSomething = &InternalFunction;
    }

    static void InternalFunction() {
        cout << "I'm the tricky loser." << endl;
    }

};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,对于所有三个结构,我可以在该结构的对象上调用DoSomething()并使其工作(尽管每个结构的实现方式不同):

MyStruct1 a;
MyStruct2 b;
MyStruct3 c;

a.DoSomething(); // works, calls Struct1's instance function
b.DoSomething(); // works, calls Struct2's …
Run Code Online (Sandbox Code Playgroud)

templates metaprogramming variadic switch-statement c++11

17
推荐指数
1
解决办法
6596
查看次数

使用ASM重写Java本机方法

我试图通过使用ASM 4.0重写类的字节码来替换所有nativenative存根方法.

到目前为止我有这个:

class ClassAdapter extends ClassVisitor {

    public ClassAdapter(ClassVisitor cv) {
        super(Opcodes.ASM4, cv);
    }

    @Override
    public MethodVisitor visitMethod(int access, String base, String desc, String signature, String[] exceptions) {
        return cv.visitMethod(access & ~Opcodes.ACC_NATIVE, base, desc, signature, exceptions);
    }

}
Run Code Online (Sandbox Code Playgroud)

由执行

private static byte[] instrument(byte[] originalBytes, ClassLoader loader) {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    ClassAdapter adapter = new ClassAdapter(cw);

    ClassReader cr = new ClassReader(originalBytes);
    cr.accept(adapter, ClassReader.SKIP_FRAMES);

    return cw.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)

这似乎很简单:我删除ACC_NATIVE了方法visitMethod()并保留其他所有内容.然而,当我这样做时java.lang.Object …

java java-native-interface bytecode metaprogramming sandbox

17
推荐指数
1
解决办法
1677
查看次数