程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++11模版元編程,11模版編程

C++11模版元編程,11模版編程

編輯:C++入門知識

C++11模版元編程,11模版編程


1.概述

  模版元編程(template metaprogram)是C++中最復雜也是威力最強大的編程范式,它是一種可以創建和操縱程序的程序。模版元編程完全不同於普通的運行期程序,它很獨特,因為模版元程序的執行完全是在編譯期,並且模版元程序操縱的數據不能是運行時變量,只能是編譯期常量,不可修改,另外它用到的語法元素也是相當有限,不能使用運行期的一些語法,比如if-else,for等語句都不能用。因此,模版元編程需要很多技巧,常常需要類型重定義、枚舉常量、繼承、模板偏特化等方法來配合,因此編寫模版元編程比較復雜也比較困難。

  現在C++11新增了一些模版元相關的特性,不僅可以讓我們編寫模版元程序變得更容易,還進一步增強了泛型編程的能力,比如type_traits讓我們不必再重復發明輪子了,給我們提供了大量便利的元函數,還提供了可變模板參數和tuple,讓模版元編程“如虎添翼”。本文將向讀者展示C++11中模版元編程常用的技巧和具體應用。

2.模版元基本概念

  模版元程序由元數據和元函數組成,元數據就是元編程可以操作的數據,即C++編譯器在編譯期可以操作的數據。元數據不是運行期變量,只能是編譯期常量,不能修改,常見的元數據有enum枚舉常量、靜態常量、基本類型和自定義類型等。

  元函數是模板元編程中用於操作處理元數據的“構件”,可以在編譯期被“調用”,因為它的功能和形式和運行時的函數類似,而被稱為元函數,它是元編程中最重要的構件。元函數實際上表現為C++的一個類、模板類或模板函數,它的通常形式如下:

template<int N, int M>
struct meta_func
{
    static const value = N+M;
}

  調用元函數獲取value值:cout<<meta_func<1, 2>::value<<endl;

  meta_func的執行過程是在編譯期完成的,實際執行程序時,是沒有計算動作而是直接使用編譯期的計算結果的。元函數只處理元數據,元數據是編譯期常量和類型,所以下面的代碼是編譯不過的:

int i = 1, j = 2;
meta_func<i, j>::value; //錯誤,元函數無法處理運行時普通數據

  模板元編程產生的源程序是在編譯期執行的程序,因此它首先要遵循C++和模板的語法,但是它操作的對象不是運行時普通的變量,因此不能使用運行時的C++關鍵字(如if、else、for),可用的語法元素相當有限,最常用的是:

  • enum、static const,用來定義編譯期的整數常量;
  • typedef/using,用於定義元數據;
  • T、Args...,聲明元數據類型;
  • template,主要用於定義元函數;
  • "::",域運算符,用於解析類型作用域獲取計算結果(元數據)。

如果模板元編程中需要if-else、for等邏輯時該怎麼辦呢?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved