(Im)perfect Forwarding

  • 引数は5個まで (実装)
    • 試しに10個にするとコンパイル時間が大変なことになった
  • これもただの実験コードというわけではなく、
    • Boost.Lambda functorを一時オブジェクトを実引数に取れるように変換できる
    • lambda::ret<>に相当する機能を付けられる
  • 関数オブジェクトの型の名前はBoost.Protoを見るとopという名前空間に置いているようだ

[]#include[] []<boost/lambda/core.hpp>[]
[]#include[] []<boost/utility/result_of.hpp>[]
[]#include[] []<pstade/forward.hpp>[]
[]#include[] []<pstade/reference.hpp>[]
[]#include[] []<pstade/result_of_lambda.hpp>[]

[]using[] []namespace[] []pstade[][];[]
[]namespace[] []lambda[][] = [][]boost[][]::[][]lambda[][];[]


[]void[] []test[][]()[]
[]{[]
[]// lambda::_1(12); // error[]
[]lambda[][]::[][]_1[][]([][]12[][]|[][]to_reference[][]); [][]// ok[]

[]boost[][]::[][]result_of[][]<[]
[]boost[][]::[][]result_of[][]<[][]op_forward[][]([][]op_lambda_1[][])>::[][]type[][]([][]int[][])[]
[] >::[][]type[] []x[][] =[]
[]forward[][]([][]lambda[][]::[][]_1[][])([][]12[][]);[]

[]BOOST_CHECK[][]( [][]x[][] == [][]12[][] );[]
[]}[]