这是我的代码(简化现实生活中的问题):

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::*)()>这样的东西应该可以解决问题。

编辑:这是一些丑陋的代码,以使其可维护。请注意以下几点:

  • 可以通过各种方式改进
  • 请添加代码以处理不存在的 token 。我没有错误检查。

  • #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/

    10-09 05:05