这是我的代码(简化现实生活中的问题):
class Foo {
public:
void f(const string& s) {
if (s == "lt") {
return lt();
} else if (s == "lte")
return lte();
} else if (s == "gt")
return gt();
} else if (s == "gte")
return gte();
}
}
void lt() { /* skipped */ }
void lte() { /* skipped */ }
void gt() { /* skipped */ }
void gte() { /* skipped */ }
};
这就是我在PHP/Python/JavaScript/许多其他语言(例如PHP)中的处理方式:
class Foo {
function f($s) {
return $this->$s();
}
function lt() { /* skipped */ }
function lte() { /* skipped */ }
function gt() { /* skipped */ }
function gte() { /* skipped */ }
}
如何使我的C++代码像这个PHP示例一样优雅?提前致谢。
最佳答案
C++中没有体现。但是,像std::map<std::string, void (Foo::*)()>
这样的东西应该可以解决问题。
编辑:这是一些丑陋的代码,以使其可维护。请注意以下几点:
#define BEGIN_TOKEN_MAP \
template <int n> \
struct add_to_ \
{ \
static void act() {} \
}; \
std::map<std::string, void (Foo::*)()> map_;
#define DECLARE_TOKEN(str, n) \
template <> struct add_to_<n> \
{ \
static void act() { map_[#str] = &Foo::##str; add_to<n+1>::act();} \
};\
void str()
#define END_TOKEN_MAP \
void init_map() { add_to_<0>::act(); } \
void process_token(std::string s) { (this->*map_[s])(); }
class Foo
{
BEGIN_TOKEN_MAP
DECLARE_TOKEN(lt, 0) { ... }
DECLARE_TOKEN(gt, 1) { ... }
...
END_TOKEN_MAP
Foo() { init_map(); }
void f(const std::string& s) { process_token(s); }
};
关于c++ - 在C++中,有什么比这个丑陋的构造更好的选择?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3140683/