功能类似于Perl在C ++中的AUTOLOAD

时间:2017-05-26 13:08:42

标签: c++ autoload generic-programming

Perl允许您使用名为AUTOLOAD的功能捕获对未定义方法的调用。每当您调用Perl无法找到的方法时,它将查找AUTOLOAD方法并调用它。这可以以许多不同的方式使用。 有关详细信息,请参阅:AUTOLOAD

最近我进入了C ++,很奇怪是否有办法在C ++程序中模拟这种功能。我知道C ++中的所有内容都需要在编译时进行相当多的定义,这使得这个问题变得棘手,但我想必须有一些涉及模板或其他技巧的技术至少可以接近。

你可以在C ++中获得Perl的AUTOLOAD功能最接近的是什么?

2 个答案:

答案 0 :(得分:5)

在Perl AUTOLOAD的有意义定义中,这是不可能的。

基本问题是在C ++编译时解析方法名称。 in some cases a method call is resolved at run time确实如此。但是,这是一个关于哪个已经定义的方法要调用的决定。

在C ++中不存在具有在源文件中调用的方法名称以及在没有该名称的任何方法的情况下编译代码的基本功能。

当然,如果您认为重写Perl是一个合理的答案,那么答案是肯定的,这是可能的。但后来这成了一个微不足道的问题。

答案 1 :(得分:-3)

加油吧......不要那么悲观,只是说事情是不可能的,因为这很容易。每种语言都有一种方法可以做任何事情。是的,有时它是超级hacky和可怕的,但超级hacky可怕的答案在这里完全没问题!我想把它想象成一种学习经验,而不是把它放在生产代码中。

这绝不是一个好的或完整的答案,但这是我从C ++中得到的最接近的答案。在我的示例中,call方法被用作一种hacky“自动加载器”。它绝对可以做得更好,并且有一些方法可以更接近Perl的AUTOLOAD功能,而无需编写全新的语言。我要问的只是让你发挥创意!

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Test {
public:
    Test() {
            table["get"]["x"] = 1;
            table["get"]["y"] = 2;
    }

    int call(string method, string arg) {
        if (method == "get") {
            return table[method][arg];
        }
        else {
            // Do something else
        }
        return 0;
    }
private:
    map<string, map<string, int> > table;
};

int main(int argc, char* argv[]) {
    Test test;
    cout << test.call("get","x") << endl;
    cout << test.call("get","y") << endl;
}