我想知道我的想法.我想问你是否知道任何与此相关的图书馆或文章.或者你可以告诉我这是一个愚蠢的想法,为什么.
我有一个类,我想在运行时动态地添加方法/属性.我很清楚使用复合/命令设计模式和使用嵌入式脚本语言来完成我所说的技巧.我只是在探索这个想法.没必要说这是个好主意.
class Dynamic
{
public:
typedef std::map<std::string, boost::function<void (Dynamic&)> > FuncMap;
void addMethod(const std::string& name, boost::function<void (Dynamic&)> func) {
funcMap_[name] = func;
}
void operator[](const std::string& name) {
FuncMap::iterator funcItr = funcMap_.find(name);
if (funcItr != funcMap_.end()) {
funcItr->second(*this);
}
}
private:
FuncMap funcMap_;
};
void f(Dynamic& self) {
doStuffWithDynamic(self);
}
int main()
{
Dynamic dyn;
dyn.addMethod("f", boost::bind(&f, _1));
dyn["f"]; // invoke f
}
Run Code Online (Sandbox Code Playgroud)
我的想法是我可以在运行时将名称"f"重新绑定到任何函数.我知道字符串查找和boost :: function与原始函数指针的性能问题.通过一些努力工作和非便携式黑客攻击,我认为我可以减轻性能问题.
使用相同类型的技术,我可以通过使用"v-table"进行名称查找和基于动态运行时属性的调度函数调用来执行"运行时继承".
如果只想告诉我使用smalltalk或Objective-C,我可以尊重这一点,但我喜欢我的C++并且我坚持使用它.
你想要的是将C++变成非常不同的东西.C++的(许多)目标之一是有效的实现.对函数调用进行字符串查找(无论你如何实现它),与普通的调用机制相比,效率都不高.
基本上,我认为你正在试图用不同语言的功能进行窃听.你可以在某种程度上使它工作,但是你正在创建其他任何人都无法(或愿意)试图理解的C++代码.
如果你真的想用一种可以动态改变它的对象的语言来写,那就去找一种这样的语言(有很多选择,我敢肯定).试图将这种功能强加于C++只会让你遇到问题.
请注意,将非C++概念引入C++并不奇怪.我曾经花了相当多的时间去除另一位工程师将基础对象系统引入C++项目的尝试(他喜欢'Object*'的容器的想法,所以他让系统中的每个类都从他自己的'下降'对象'类).
引入外语概念几乎总是以两种方式结束:概念与其他C++概念相遇,并且不能像在源语言中那样工作,并且概念往往会破坏C++中的其他东西.你最终会失去大量的时间来尝试实现一些无法解决的问题.
我能够看到类似这样的东西的唯一方法是,如果你在C++之上使用cfront风格的预编译器实现了一种新语言.这样,你可以在这个东西上加上一些不错的语法,并消除你的一些问题.