此代碼應該回答你的問題,即使不完全 。事實上,我通過使用virtual
調用解決了一些問題(注意:性能問題)。
#include <iostream>
#include <map>
struct parse_result {
// something here
};
class parser {
public:
virtual parse_result parse() = 0;
};
class parser1 : public parser {
public:
parse_result parse() {
// something here
std::cout << "Called parser1::parse()" << std::endl;
return parse_result();
}
};
class parser2 : public parser {
public:
parse_result parse() {
// something here
std::cout << "Called parser2::parse()" << std::endl;
return parse_result();
}
};
static parser1* make_parser1() {
return new parser1();
}
static parser2* make_parser2() {
return new parser2();
}
typedef parser* (*parser_factory_method)();
int main() {
std::map<char, parser_factory_method> parsers;
parsers.insert(std::make_pair('1', (parser_factory_method) make_parser1));
parsers.insert(std::make_pair('2', (parser_factory_method) make_parser2));
for (auto entry : parsers) {
std::cout << "Calling parser for " << entry.first << std::endl;
parser_factory_method pfm = entry.second;
parser* p = pfm();
p->parse(); // parse_result is ignored here, but can be used as needed
delete p;
}
return 0;
}
請注意,我不喜歡的解析器這個設計。它以某種方式模仿Java反射,註定會遇到性能問題。看看你是否可以改進它。
來源
2013-05-26 11:46:01
gd1
解析是通過在所有對象之間共享的「類」方法/函數完成的,那麼您爲什麼要每次都創建一個類的新實例?只需存儲與<<相關聯的類的全局對象並使用它的方法即可。 – iammilind
因爲按照我設計我的解析器的方式,表達式是一個對象,它將自己從一段字符串中解析出來。 – Virus721
如果你有興趣編寫一個解析/詞法分析器,我建議看看'libclang',例如http://stackoverflow.com/questions/14509120/any-tutorial-on-libclang – user2384250