首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 模板高級用法全解析:可變參數、仿函數、元編程、智能指針

     編輯:關於C++

1. 可變參數模板

解決參數個數、類型不固定的函數封裝問題,遞歸展開參數包。

#include <iostream>
#include <array>
void showall() { return; } // 遞歸終止
template <typename R1, typename... Args>
void showall(R1 var, Args... args) {
    std::cout << var << std::endl;
    showall(args...); // 剩餘參數遞歸
}
int main() {
    showall(1, 2, 3, 4, 5);
    showall("gxjun", "dadw", "dasds");
    showall(1.0, 2.0, 3.5);
    return 0;
}

2. 仿函數

重載 operator() 的類/結構體,可像函數一樣調用,配合 std::bind 綁定成員函數。

#include <iostream>
#include <functional>
using namespace std;
template <typename R1, typename R2>
struct Calc {
    void add(R1 a) { cout << a << endl; }
    void add_1(R1 a, R1 b) { cout << a + b << endl; }
};
int main() {
    Calc<int, int> calc;
    auto fun = bind(&Calc<int,int>::add, &calc, placeholders::_1);
    auto fun2 = bind(&Calc<int,int>::add_1, &calc, placeholders::_1, placeholders::_2);
    fun(123); fun2(12, 24);
    return 0;
}

3. using/typedef 別名與函數指針

簡化複雜類型聲明,統一函數指針調用接口。

// using 別名
using Func = int(*)(int, int, int, int);
Func func = calc; // calc 為可變參數模板函數
func(1,2,3,4);

4. 模板元編程:編譯期計算

利用模板特化在編譯期完成遞歸計算,運行期直接取結果。

template <long N> struct Fib {
    enum { res = Fib<N-1>::res + Fib<N-2>::res };
};
template <> struct Fib<1> { enum { res = 1L }; };
template <> struct Fib<0> { enum { res = 1L }; };
// 使用:Fib<45>::res 編譯期即得出結果

5. 智能指針對比

模式代碼特點
裸指針不釋放double* p = new double;內存洩漏
裸指針手動釋放delete p;易忘釋放/重複釋放
auto_ptr (C++98)auto_ptr<double> ps(p);所有權轉移,已棄用
unique_ptr (C++11)unique_ptr<double> ps(new double);獨占所有權,推薦使用

智能指針優勢:自動釋放、避免洩漏、異常安全、無運行期開銷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved