编译时的编程机制

1.阶乘

template<int n> class Factorial{
public:
    enum{
        val=Factorial<n-1>::val*n
    };
};
template<> class Factorial<0>{
public:
    enum{
        val=1   
    };
};
Factorial<>::val;       //120

2.斐波那契数列

template<int n> class Fib{
public:
    enum{
        val=Fib<n-1>::val+Fib<n-2>::val
    };
};
template<> class Fib<1>{
public:
    enum{
        val=1   
    };
};
template<> class Fib<0>{
public:
    enum{
        val=0   
    };
};
Fib<5>::val;        //5

3.N的P次方

template<int N,int P> class Power{
public:
    enum{
        val=N*Power<N,P-1>::val
    };
};
template<int N> class Power<N,0>{
public:
    enum{
        val=1
    };
};
Power<2,5>::val;        //32

4.f(n)+f(n-1)….f(0)

template<int n, template<int> typename F> class Accumulate {
public:
    enum {
        val=Accumulate<n-1,F>::val+F<n>::val
    };
};
template<template<int> typename F> class Accumulate<0, F> {
public:
    enum {
        val=F<0>::val
    };
};
template<int n> class Identity {
public:
    enum {
        val=n
    };
};
Accumulate<4, Identity>::val;       //10

5.循环分解,整数幂

template<int n> inline int power(int m){
    return power<n-1>(m)*m;
};
template<> inline int power<1>(int m){
    return m;
};
template<> inline int power<0>(int m){
    return 1;
};
power<3>(4);        //64

6.编译时的条件选择:最大值

template<int n1,int n2> class Max{
    enum{
        val=n1>n2?n1:n2
    };
};
Max<10,20>::val;        //20

7.表达式模板

template<class, std::size_t> class MyVectorSum;
template<typename T, std::size_t N> class MyVector {
private:
    T data[N];
public:
    MyVector<T, N> &operator=(const MyVector<T, N> &right) {
        for (std::size_t i = 0; i < N; ++i) {
            data[i] = right.data[i];
        }
        return *this;
    }
    MyVector<T, N> &operator=(const MyVectorSum<T, N> &right);
    const T &operator[](std::size_t i) const {
        return data[i];
    }
    T &operator[](std::size_t i) {
        return data[i];
    }
};
template<typename T, std::size_t N> class MyVectorSum {
private:
    const MyVector<T, N> &left;
    const MyVector<T, N> &right;
public:
    MyVectorSum(const MyVector<T,N> &lhs,const MyVector<T,N> &rhs):left(lhs),right(rhs){}
    T operator[](std::size_t i) const {
        return left[i] + right[i];
    }
};
template<typename T, std::size_t N> 
MyVector<T, N> &MyVector<T, N>::operator=(const MyVectorSum<T, N> &right) {
    for (std::size_t i = 0; i < N; ++i) {
        data[i] = right[i];
    }
    return *this;
}
template<typename T,std::size_t N> 
inline MyVectorSum<T, N> operator+(const MyVector<T, N> &left, const MyVector<T, N> &right) {
    return MyVectorSum<T, N>(left, right);
}
template<typename T,std::size_t N>
void init(MyVector<T, N> &v) {
    for (std::size_t i = 0; i < N; ++i) {
        v[i] = rand() % 100;
    }
}
template<typename T, std::size_t N> 
void print(MyVector<T, N> &v) {
    for (std::size_t i = 0; i < N; ++i) {
        std::cout << v[i] << ' ';
    }
    std::cout << endl;
}

void main() {
    srand(time(0));
    MyVector<int, 5> v1;
    init(v1);
    print(v1);
    MyVector<int, 5> v2;
    init(v2);
    print(v2);
    MyVector<int, 5> v3;
    init(v3);
    print(v3);
    v3.operator=(MyVectorSum<int, 5>(v2, v3));
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值