可変長引数:問題2.20
C++11の可変長引数テンプレートは、再帰と組み合わせるとかなり強力だなあ。
----
//---------abstraction
barrier---------
template<typename
...Arguments>
const
List sameParity(const int arg1, const Arguments& ...args)
{
const int parity(arg1%2);
function<List(List)>
filterSameParity;
filterSameParity=[parity,&filterSameParity]
(const List& numList){
if(isNull(numList)){return(numList);}
if(parity!=value<int>(car(numList))%2){
return(filterSameParity(cdr(numList)));
}
return(cons(car(numList),filterSameParity(cdr(numList))));
};
return(cons(arg1,filterSameParity(makeList(args...))));
}
int
main(int argc, char** argv)
{
auto list1(sameParity(1,2,3,4,5,6,7));
cout<<"(same-parity 1 2 3 4 5 6
7)="<<listString(list1)<<endl;
auto list2(sameParity(2,3,4,5,6,7));
cout<<"(same-parity 2 3 4 5 6
7)="<<listString(list2)<<endl;
}
----
出力
----
(same-parity
1 2 3 4 5 6 7)=(1 3 5 7)
(same-parity
2 3 4 5 6 7)=(2 4 6)
0 件のコメント :
コメントを投稿