初期化キャプチャ(init-capture)で、可変長引数テンプレート(variadic templates)をキャプチャしようと思って調べてのですが、できないようです。キャプチャデフォルト(capture-default)と単純キャプチャ(simple-capture)でキャプチャすることは出来ます。
#include <iostream> #include <utility> void print() {} template <typename T, typename ...Args> void print(T&& t, Args&&... args) { std::cout << t << std::endl; print(std::forward<Args>(args)...); } template <typename ...Args> auto f(Args&&... args) { return [&](){ print(std::forward<Args>(args)...); }; // ok. capture-defaultでキャプチャできる //return [&args...](){ print(std::forward<Args>(args)...); }; // ok. simple-captureでキャプチャできる //return [&args = args](){ print(std::forward<Args>(args)...); }; // NG //return [&args... = args](){ print(std::forward<Args>(args)...); }; // NG //return [&args = args...](){ print(std::forward<Args>(args)...); }; // NG //return [&args... = args...](){ print(std::forward<Args>(args)...); }; // NG //return [&args = std::forward<Args>(args)...](){ print(std::forward<Args>(args)...); }; // NG } int main() { auto disp = f(1, 3.14, "hello"); disp(); }
実行結果
1 3.14 hello