动态C++

Shi*_*Yip 0 c++

我想知道我的想法.我想问你是否知道任何与此相关的图书馆或文章.或者你可以告诉我这是一个愚蠢的想法,为什么.

我有一个类,我想在运行时动态地添加方法/属性.我很清楚使用复合/命令设计模式和使用嵌入式脚本语言来完成我所说的技巧.我只是在探索这个想法.没必要说这是个好主意.

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++并且我坚持使用它.

Mic*_*hne 8

你想要的是将C++变成非常不同的东西.C++的(许多)目标之一是有效的实现.对函数调用进行字符串查找(无论你如何实现它),与普通的调用机制相比,效率都不高.

基本上,我认为你正在试图用不同语言的功能进行窃听.你可以在某种程度上使它工作,但是你正在创建其他任何人都无法(或愿意)试图理解的C++代码.

如果你真的想用一种可以动态改变它的对象的语言来写,那就去找一种这样的语言(有很多选择,我敢肯定).试图将这种功能强加于C++只会让你遇到问题.

请注意,将非C++概念引入C++并不奇怪.我曾经花了相当多的时间去除另一位工程师将基础对象系统引入C++项目的尝试(他喜欢'Object*'的容器的想法,所以他让系统中的每个类都从他自己的'下降'对象'类).

引入外语概念几乎总是以两种方式结束:概念与其他C++概念相遇,并且不能像在源语言中那样工作,并且概念往往会破坏C++中的其他东西.你最终会失去大量的时间来尝试实现一些无法解决的问题.

我能够看到类似这样的东西的唯一方法是,如果你在C++之上使用cfront风格的预编译器实现了一种新语言.这样,你可以在这个东西上加上一些不错的语法,并消除你的一些问题.

  • 你是对的.他不妨使用Python等. (3认同)