编辑代码

#include <iostream>
#include <type_traits>

template <int N>
struct Fibonacci {
    //对于每个N,Fibonacci<N>::value的值被定义为Fibonacci<N - 1>::value和Fibonacci<N - 2>::value的和,这正是斐波那契数列的递归定义。
    static constexpr int value = Fibonacci<N - 1>::value + Fibonacci<N - 2>::value;
};

// 特化:递归的基本情况
///然而,递归需要有一个终止条件。在斐波那契数列中,第0项是0,第1项是1。这些是我们的基本情况,我们使用template<>来为这两种情况提供特化实现:
template <>
struct Fibonacci<0> {
    static constexpr int value = 0;
};

template <>
struct Fibonacci<1> {
    static constexpr int value = 1;
};


// -----------------------------------------

template <typename T>
struct IsPointer : std::false_type {};

// 模板特化针对指针类型
template <typename T>
struct IsPointer<T*> : std::true_type {};

// -----------------------------------------


// 一个示例函数,其行为取决于模板参数T是否是整数类型
template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
getValue(T t) {
    // 仅当T是整数类型时,此函数实例可用
    return t;
}

// 重载函数,用于非整数类型
template <typename T>
typename std::enable_if<!std::is_integral<T>::value, T>::type
getValue(T t) {
    // 仅当T不是整数类型时,此函数实例可用
    return T(); // 返回T的默认值
}

int main() {
    // 编译时计算Fibonacci数列的第5项
    constexpr int fib5 = Fibonacci<5>::value;
    std::cout<<"fib5="<<fib5<<std::endl;
     constexpr int fib6 = Fibonacci<6>::value;
    std::cout<<"fib6="<<fib6<<std::endl;
     constexpr int fib7 = Fibonacci<7>::value;
    std::cout<<"fib7="<<fib7<<std::endl;

// -----------------------------------------

    constexpr bool intIsPointer = IsPointer<int>::value;         // false
    constexpr bool intPtrIsPointer = IsPointer<int*>::value;     // true

    ///--我们使用了类型萃取的技术来检查一个类型是否是指针类型。
    ///======IsPointer的基本模板返回std::false_type,而指针类型的特化返回std::true_type。
    std::cout<<"intIsPointer="<<intIsPointer<<std::endl;
    std::cout<<"intPtrIsPointer="<<intPtrIsPointer<<std::endl;

// -----------------------------------------
    std::cout << getValue(10) << std::endl;   // 正常工作,输出 10
    std::cout << getValue(3.14) << std::endl; // 正常工作,输出 0.0(double的默认值)

    return 0;
}