変数名推論

  • tupleの場合はできます
  • "推論"に、使用する関数の仮引数の型を使える場合もあります (auto_element)


[]#include[] []<set>[]

[]#pragma[][] warning(push)[]
[]#pragma[][] warning(disable: 4100 4180 4355 4511 4512)[]
[]#include[] []<boost/spirit/fusion/algorithm/find.hpp>[]
[]#include[] []<boost/spirit/fusion/iterator/deref.hpp>[]
[]#include[] []<boost/spirit/fusion/sequence/tuple.hpp>[]
[]#pragma[][] warning(pop)[]

[]#include[] []<boost/assert.hpp>[]
[]#include[] []<boost/mpl/identity.hpp>[]

[]#define[][] VARNAME_INFERENCE(obj, type) \[]
[] *[][]boost[][]::[][]fusion[][]::[][]find[][]([][]obj[][], [][]boost[][]::[][]mpl[][]::[][]identity[][]<[][]type[][]>()) \[]
[]/**/[]

[]template[][]< [][]class[] []ElemT[][], [][]class[] []FusionSeq[][] >[]
[]typename[] []boost[][]::[][]fusion[][]::[][]meta[][]::[][]deref[][]<[]
[]typename[] []boost[][]::[][]fusion[][]::[][]meta[][]::[][]find[][]< [][]FusionSeq[][], [][]ElemT[][] >::[][]type[]
[]>::[][]type[]
[]element_cast[][]([][]FusionSeq[][]& [][]seq[][])[]
[]{[]
[]return[] []boost[][]::[][]fusion[][]::[][]deref[][]( [][]boost[][]::[][]fusion[][]::[][]find[][]([][]seq[][], [][]boost[][]::[][]mpl[][]::[][]identity[][]<[][]ElemT[][]>()) );[]
[]}[]

[]template[][]< [][]class[] []FusionSeq[][] >[]
[]struct[] []auto_element_type[]
[]{[]
[]explicit[] []auto_element_type[][]([][]FusionSeq[][] *[][]pseq[][]) : [][]m_pseq[][]([][]pseq[][]) { }[]

[]template[][]< [][]class[] []ElemT[][] >[]
[]operator[] []ElemT[][]() [][]const[][] { [][]return[] []element_cast[][]<[][]ElemT[][]>(*[][]m_pseq[][]); }[]

[]private[][]:[]
[]FusionSeq[][] *[][]m_pseq[][];[]
[]}; []

[]template[][]< [][]class[] []FusionSeq[][] >[]
[]inline[] []auto_element_type[][]<[][]FusionSeq[][]> [][]auto_element[][]([][]FusionSeq[][]& [][]seq[][])[]
[]{[]
[]return[] []auto_element_type[][]<[][]FusionSeq[][]>(&[][]seq[][]);[]
[]}[]

[]char[] []to_upper[][]([][]char[] []ch[][])[]
[]{[]
[]if[][] ([][]'A'[][] <= [][]ch[][] && [][]ch[][] <= [][]'Z'[][])[]
[]return[] []ch[][];[]

[]return[] []ch[][] - [][]'a'[][] + [][]'A'[][];[]
[]}[]

[]int[] []main[][]()[]
[]{[]
[]std[][]::[][]set[][]<[][]int[][]> [][]set[][];[]
[]typedef[] []std[][]::[][]set[][]<[][]int[][]>::[][]iterator[] []iterator[][];[]

[]boost[][]::[][]fusion[][]::[][]tuple[][]<[][]iterator[][], [][]bool[][]> [][]result[][] = [][]set[][].[][]insert[][]([][]3[][]);[]

[]BOOST_ASSERT[][](*[][]VARNAME_INFERENCE[][]([][]result[][], [][]iterator[][]) == [][]3[][]);[]
[]BOOST_ASSERT[][](*[][]element_cast[][]<[][]iterator[][]>([][]result[][]) == [][]3[][]);[]

[]boost[][]::[][]fusion[][]::[][]tuple[][]<[][]int[][], [][]char[][], [][]double[][]> [][]t[][]([][]12345[][], [][]'x'[][], [][]3.36[][]);[]
[]BOOST_ASSERT[][]([][]to_upper[][]([][]auto_element[][]([][]t[][])) == [][]'X'[][]);[]

[]return[] []0[][];[]
[]}[]