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



Perl 允许您使用名为 AUTOLOAD 的功能捕获对未定义方法的调用。每当你调用一个 Perl 找不到的方法时,它都会寻找一个AUTOLOAD的方法并调用它。这可以以许多不同的方式使用。有关更多信息,请参阅: 自动加载

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

在C++中,你能得到的 Perl AUTOLOAD 功能最接近的是什么?

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

基本问题是方法名称是在编译时解析的 C++。 确实,在某些情况下,方法调用是在运行时解析的。 但是,这是关于调用哪个已定义方法的决定。

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

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

来吧伙计们...不要那么悲观,只是说事情是不可能的,因为这是一件容易的事情。 总有一种方法可以用每种语言做任何事情。 是的,有时它是超级黑客和可怕的,但超级黑客可怕的答案在这里非常好! 我想把它作为一种学习体验,而不是把它放在生产代码中。

这绝不是一个好的或完整的答案,但这是我能从C++那里得到的最接近的答案。 在我的示例中,call方法被用作一种黑客"自动加载器"。它肯定可以做得更好,并且肯定有办法在不编写全新语言的情况下更接近 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;
}

最新更新