2012-08-07

SCIP in C++11 ― 2.2.1節 その3


可変長引数:問題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 件のコメント :

コメントを投稿