代码之家  ›  专栏  ›  技术社区  ›  Aykhan Hagverdili

通用任务包装器

c++
  •  0
  • Aykhan Hagverdili  · 技术社区  · 3 年前

    void DispatchToGuiThread(std::function<void(void)> task);
    

    我想要一个普通的 GUIDispatchedTask 类,该类将:

    // foo takes some arguments and must be run in the gui thread
    
    auto guiDispatchedTask = [] (A a, B b, C c, D d) {
      DispatchToGuiThread(
        [a = a, b = b, c = c] {
          foo(a, b, c);
        }
      );
    };
    

    auto guiDispatchedTask = GUIDispatchedTask{ foo };
    

    我不想重复我的论点 foo 喜欢 GUIDispatchedTask<A, B, C> 因为 很可能是一个lambda,重复这些论点是乏味的。我做不到。

    2 回复  |  直到 3 年前
        1
  •  1
  •   Aykhan Hagverdili    3 年前

    使用来自 the comments ,以下是我所做的:

    #include <stdio.h>
    #include <functional>
    
    void DispatchToGuiThread(std::function<void(void)> task) {
      puts("in gui thread");
      task();
    }
    
    template <class Func>
    struct GUIDispatchedTask
    {
    private:
      Func _func;
    
    public:
      GUIDispatchedTask(Func func)
        : _func(std::move(func))
      {}
    
      template <class ...T>
      void operator()(T... args) {
        DispatchToGuiThread([this, ...args = args] {
            _func(args...);
        });
      }
    };
    
    void foo(int a, int b, int c) {
      printf("a = %d\nb = %d\nc = %d\n", a, b, c);
    }
    
    int main() {
      auto guiFoo = GUIDispatchedTask{foo};
    
      guiFoo(1, 2, 3);
    }
    

    Demo

        2
  •  1
  •   apple apple    3 年前

    您也可以使用通用lambda来实现。

    template<typename F>
    auto GUIDispatchedTask(F f){
        return [=](auto&&... args){
            DispatchToGuiThread([=]{f(args...);});
        };
    }