変数名推論
- 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[][];[]
[]}[]