美文网首页
C++11 新特性(十)

C++11 新特性(十)

作者: IT孤独者 | 来源:发表于2018-09-17 21:52 被阅读0次

    昨天引入了不定长参数模板,给了一个简单的例子,用来封装C语言的printf函数,其实是想从侧面说,不定长参数模板具有和C语言不定长参数相似的特性。只是一个引子。

    进入正题:如何编写一个不定长参数的求和函数?

    代码如下:

    #include <iostream>
    
    using namespace std;
    
    template <typename T>
    auto sum_rec(T first) {
        return first;
    }
    
    template <typename T1, typename...  T2>
    auto sum_rec(T1 first, T2... rest) {
        return first + sum_rec(rest...);
    }
    
    template <typename... T>
    auto sum(T... nums) {
        return sum_rec(nums...);
    }
    
    int main() {
        std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
    
        return 0;
    }
    

    sum_rec 是 sum 的实现函数,sum_rec 有两种形式,一种是递归形式,一种是递归终止形式。

    函数式编程有几个特别有意思的东西,一个是first,一个是rest,还有一个是apply,今天我们说first和rest。

    你从我的代码中可以看出来,如果有某种机制,可以直接操作 nums... ,使得我可以取得第一个元素和剩余的元素,最好能够判定出 nums... 的长度,从而我就不需要写三个函数了,我只要写一个函数就行了,类似C语言的递归形式,一个理想的伪代码如下:

    template <typename... T>
    auto sum(T... nums) {
        if (len(num...) == 1) {
            return first(num...)
        } else {
            return first(num...) + sum(rest(num...));
        }
    }
    

    其中 first(num...) 取出第一个元素, rest(num...) 将除掉第一个元素的剩余元素展开,len(num...)可以返回元素个数。

    相关文章

      网友评论

          本文标题:C++11 新特性(十)

          本文链接:https://www.haomeiwen.com/subject/osadnftx.html