什么是反射?我阅读了关于这个主题的维基百科文章,我理解它是一种元编程,程序可以在运行时自行修改,但这意味着什么?在什么样的情况下这是一个好的方法,何时最好使用它?
恕我直言,OOPS,设计模式是有道理的,我已经能够实际应用它们.
但是当谈到 Modern C++类的"泛型编程/元编程"时,我感到很困惑.
- 这是一种新的编程/设计范式吗?
- 它仅限于"图书馆开发"吗?如果没有,那么设计/编码情况需要使用元编程/泛型编程.
- 使用模板意味着我正在进行通用编程吗?
我在这个主题上搜索了很多,但没有完全掌握大图.另见这篇文章.
在阅读了这里的讨论之后,到目前为止,我确信(可能仍然不正确):
a)通用编程和元编程是两个不同的概念.
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)组合来定义一个单独的方法,我想知道是否有这两个之间有一些本质上的区别.
究竟有什么区别?似乎这些术语可以互换使用,但是阅读了Objective-c的维基百科条目,我遇到了:
除了C的过程编程风格之外,C++还直接支持某些形式的面向对象编程,泛型编程和元编程.
参考C++.显然他们有所不同?
我想在瞬间做一些魔术,并将类方法添加到某个类中.因此我尝试了以下方法:
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)
这种方法适用于实例方法,类方法失败.我怎么解决这个问题?有什么建议?
在所有项目中,我通过跨越这样的要求,我再也没几年完成的,但它似乎在纸上那么容易:写一个插件为许多知名的CMS的.
显然,每个插件系统(或扩展系统)都是不同的,这需要通过适配器模式的特定桥接代码.但核心应该写一次.我不希望WordPress用户使用PHP-Java桥,我不希望DotNetNuke用户使用.NET-Native桥(尽管这更容易构思).
我认为,核心应该在涵盖大多数CMS系统的三个主要领域中进行编译:
C#和Java相互之间的转换非常好,但C和C#要难得多.最终,可能会添加其他目标,以免在使用插件之前强制WordPress或WikiMedia用户安装扩展程序.
我确信这也是其他的.解决这些问题的常用方法是什么?我应该首先定义DSL并使用DMS或类似的转换吗?其他选择?
这可以使用模板吗?
有两个字符串常量.它们来自不同模块中的定义.它们必须相等,否则如果它们不相等,我将引发编译时错误.我可以使用模板吗?
#define MY_STRING "foo"
CompileAssertIfStringsNotEqual(MY_STRING, HIS_STRING);
Run Code Online (Sandbox Code Playgroud)
PS我被假设"abc"[0]是常量表达式而被欺骗.它不是.在语言中奇怪的遗漏.如果"abc"[0]是constand表达式,那将是可能的.
在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但无论如何都无法让它工作.)
假设我有一些像这样的结构:
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) 我试图通过使用ASM 4.0重写类的字节码来替换所有native非native存根方法.
到目前为止我有这个:
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 …
metaprogramming ×10
c++ ×3
templates ×3
java ×2
ruby ×2
bytecode ×1
c# ×1
c++11 ×1
definition ×1
dsl ×1
php ×1
reflection ×1
sandbox ×1
variadic ×1