小埋社区

    • 登录
    • 版块
    • 最新
    • 标签
    • 热门
    • 用户
    • 群组

    一种优雅地实现C++ string switch的方法

    编程
    c++
    1
    1
    516
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Bruce
      Bruce ACG 最后由 编辑

      #include <unordered_map>
      #include <functional>
      #include <string>
      #include <cstdio>
      
      template <typename T>
      class Switch
      {
      private:
          T expression;
          std::unordered_map<T, std::function<void()>> map;
          std::function<void()> defaultFunction;
      
      public:
          Switch(const T& v) { this->expression = v; }
          Switch& case_(const T& c, const std::function<void()>& f) {
              map[c] = f;
              return *this;
          }
          Switch& default_(const std::function<void()>& f) {
              this->defaultFunction = f;
              return *this;
          }
          virtual ~Switch() {
              if (map[expression]) {
                  map[expression]();
              } else {
                  defaultFunction();
              }
          }
      };
      
      int main(int argc, char* argv[])
      {
          if (argc < 2) {
              return 1;
          }
          std::string v(argv[1]);
      
          Switch<std::string>(v)
              .case_("hello", [] { std::printf("get hello\n"); })
              .case_("world", [] { std::printf("get world\n"); })
              .default_([] { std::printf("get other string\n"); });
      
          Switch<int>(argc)
              .default_([=] { std::printf("get %d args\n", argc); });
      
          return 0;
      }
      
      1 条回复 最后回复 回复 引用 0
      • First post
        Last post
      © 2017-2023 小埋社区 All Rights Reserved | 皖ICP备17016228号-2