Skip to main content

__debug's Home There is no remedy for love but to love more

C++ 中可变参数模板函数的完美转发

食屎啦 C++.

  • 完美转发 (Perfect forwarding)
  • 可变参数模板函数 (Parameter pack)
  • 但是两个结合起来不行

      #include <utility>
    
      template<class... Args>
      void f(Args&&... args) { }
    
      template<template<class...> class F, class... Args>
      void invoke(F<Args...> f, Args&&... args) {
          f(std::forward<Args>(args)...);
      }
    
      int main() {
          invoke(f, 1, 2, 3);
      }
    
  • 必须用 lambda 或者某个类包装一下

      #include <utility>
    
      template<class... Args>
      void f(Args&&... args) { }
    
      template<class F, class... Args>
      void invoke(F&& f, Args&&... args) {
          f(std::forward<Args>(args)...);
      }
    
      int main() {
          invoke([](auto&&... xs) { f(std::forward<decltype(xs)>(xs)...); }, 1, 2, 3);
      }
    
  • 最后用宏写得炫酷一点

      #include <utility>
    
      #define FORWARD(...) ::std::forward<decltype(__VA_ARGS__)>(__VA_ARGS__)
      #define WRAP(f) [&](auto&&... xs) { return f(FORWARD(xs)...); }
    
      template<class... Args>
      void f(Args&&... args) { }
    
      template<class F, class... Args>
      void invoke(F&& f, Args&&... args) {
          f(FORWARD(args)...);
      }
    
      int main() {
          invoke(WRAP(f), 1, 2, 3);
      }
    

Comments

Comments powered by Disqus