result_ofの使い方

  • 関数オブジェクトfooと、その型op::foo(cv-qualifierなし)があるとする
  • result_ofにはop::fooを渡すことになる (op::fooの参照型を渡してはいけないと思われる 20.5.4/1)
  • 厳密には、result_ofだと思うのだが、constは付けないらしい (参照)
    • 関数テンプレートなどのGenericな文脈ではちゃんとconstを(付けるべきときには)付けるらしい->保留->付けるべきだが、今のところresult_ofのバグのために付けると動かない
    • foo.operator()がconstかそうでないかでオーバーロードされていることはまずないだろう
  • result_ofのAには、対応するoperator()の実引数が、左辺値のときかつそのときに限り参照型を渡す (20.5.4/1)
    • foo.operator()自体は、引数が左辺値かどうか判断するのは困難にも関わらず。
    • result_ofで右辺値を指定されたら参照ではなく値を返すidentityなどが考えられるかもしれない
  • いわゆるtraitsクラスをユーザが使う必要がなくなる (range_result_iterator等の)

[]#include[] []<boost/utility/result_of.hpp>[]
[]#include[] []<pstade/oven/begin_end.hpp>[]

[]namespace[] []my[][] {[]

[]namespace[] []op[][] {[]

[]struct[] []logical_not[]
[] {[]
[]typedef[] []bool[] []result_type[][];[]

[]template[][]< [][]class[] []A[][] >[]
[]bool[] []operator[][]()([][]A[] []const[][]& [][]a[][]) [][]const[]
[] {[]
[]return[][] ![][]a[][];[]
[] }[]
[] };[]

[] }[]

[]op[][]::[][]logical_not[] []const[] []logical_not[][] = { }; [][]// see 8.5.1/8[]

[]}[]


[]void[] []test[][]()[]
[]{[]
[] {[]
[]// 'true/false' is not a lvalue. (2.13.5/1)[]
[]boost[][]::[][]result_of[][]<[][]my[][]::[][]op[][]::[][]logical_not[][]([][]bool[][])>::[][]type[] []a[][] = [][]my[][]::[][]logical_not[][]([][]true[][]);[]
[]BOOST_CHECK[][]([][]a[][] == [][]false[][]);[]
[] }[]
[] {[]
[]bool[] []b[][] = [][]false[][];[]
[]boost[][]::[][]result_of[][]<[][]my[][]::[][]op[][]::[][]logical_not[][]([][]bool[][]&)>::[][]type[] []a[][] = [][]my[][]::[][]logical_not[][]([][]b[][]);[]
[]BOOST_CHECK[][]([][]a[][] == [][]true[][]);[]
[] }[]
[] {[]
[]using[] []namespace[] []pstade[][];[]
[]int[] []rng[][][[][]10[][]]; [][]rng[][][[][]0[][]] = [][]10[][];[]
[]boost[][]::[][]result_of[][]<[][]oven[][]::[][]op_begin[][]([][]int[][](&)[[][]10[][]])>::[][]type[] []first[][] = [][]oven[][]::[][]begin[][]([][]rng[][]);[]
[]BOOST_CHECK[][](*[][]first[][] == [][]10[][]);[]
[] }[]
[]}[]