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 WARP(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(WARP(f), 1, 2, 3);
    }
    

Comments

Comments powered by Disqus