c++ - 动态C++

标签 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
}

我的想法是,我可以在运行时将名称“f”重新绑定(bind)到任何函数。我知道字符串查找和 boost::function 与原始函数指针的性能问题。通过一些艰苦的工作和不可移植的 hack,我认为我可以减轻性能问题的痛苦。

使用相同类型的技术,我可以通过使用“v 表”进行“运行时继承”,以根据动态运行时属性进行名称查找和分派(dispatch)函数调用。

如果只是想告诉我使用 smalltalk 或 Objective-C,我可以尊重,但我喜欢我的 C++,我会坚持使用它。

最佳答案

您想要的是将 C++ 变成非常不同的东西。 C++ 的(许多)目标之一是高效实现。为函数调用进行字符串查找(无论您实现得有多好),与正常的调用机制相比不会非常有效。

基本上,我认为您是在试图塞进另一种语言的功能。您可以在某种程度上使其发挥作用,但您正在创建其他人无法(或不愿意)尝试理解的 C++ 代码。

如果你真的想用一种可以动态改变它的对象的语言来编写,那么就去寻找这样一种语言(我敢肯定,有很多选择)。试图将这种功能硬塞进 C++ 只会给你带来麻烦。

请注意,我对将非 C++ 概念引入 C++ 并不陌生。我曾经花了相当多的时间来消除另一位工程师将基于对象的系统引入 C++ 项目的尝试(他喜欢“Object *”容器的想法,所以他使系统中的每个类都来自他自己的“对象类)。

引入外语概念几乎总是以两种方式结束:该概念与其他 C++ 概念相冲突,无法像在源语言中那样工作,并且该概念往往会破坏 C++ 中的其他内容.您最终会浪费大量时间来尝试实现一些不会成功的事情。

如果您在 C++ 之上使用 cfront 风格的预编译器实现一种新语言,我能看到这样的东西运行良好的唯一方法。这样,您就可以将一些体面的语法放在上面,并消除一些问题。

关于c++ - 动态C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1111744/

相关文章:

c++ - 为什么编译器接受带有 long double 文字的 float 的初始化?

c++ - 如何在C++中获取运行函数的时间

c++ - 将三个文本文件组合成一个文本文件,形成一个句子 C++

c++ - 来自第三类对象 C++ 的垃圾值

C++11 函数参数

c++ - 使用 math.h 时预期的初始值设定项在 'extern' 之前

c++ - 窗函数

c++ - 在 Qt 中如何运行进度条以指示其他进程正忙

c++ - 为什么不在 makefile 中生成依赖项?

c++ - 以编程方式创建和签署公钥/私钥对