最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++基本用法實(shí)踐之模板詳解

 更新時(shí)間:2023年07月17日 11:24:53   作者:寡人正在Coding  
C++的模板是泛型編程思想的一種實(shí)現(xiàn),模板不光支持函數(shù)模板,還有類模板等,本文主要來和大家聊聊C++中模板的相關(guān)用法,需要的可以參考一下

概述

C++的模板是泛型編程思想的一種實(shí)現(xiàn)。C++是強(qiáng)類型語言,處處強(qiáng)調(diào)類型。同樣的加法運(yùn)算,int和float的加法運(yùn)算需定義兩個(gè)函數(shù)(重載),而使用模板則可以只用一個(gè)函數(shù)(見下面示例)。

這類似我們面向?qū)ο笏f的多態(tài)(定義加法運(yùn)算,各個(gè)類型有不同的實(shí)現(xiàn)),所以是所謂靜多態(tài)的一種實(shí)現(xiàn)方式,不同的是,模板在編譯期展開生成int和float兩個(gè)加法函數(shù),如:

template<class T>
T add(T a, T b)
{
  return a + b;
}
int v1 = add<int>(1, 2);
// 不顯式聲明模板參數(shù)類型,編譯器會(huì)試圖推斷
float v2 = add(1.5f, 2.5f);
/*
實(shí)際上編譯器生成了兩個(gè)函數(shù)
int add<int>(int a, int b)
float add<float>(float a, float b)
*/

模板不光支持函數(shù)模板,還有類模板等,思想是一樣的(詳情見下面例子)。

模板還有一些特性機(jī)制如:模板特化,SFINAE(substitution failure is not an error 替換而非錯(cuò)誤),變長參數(shù)模板等,另外模板在元編程中也是十分重要的組成部分,我對(duì)元編程沒有太多實(shí)踐,讀者有興趣可以自行搜索。

用法舉例

參考測(cè)試項(xiàng)目ModernCppTest/modrenc_template.cpp主要內(nèi)容:

  • 函數(shù)模板&Lambda函數(shù)模板
  • 類模板
  • 別名模板
  • 變量模板
  • 值(枚舉)作為模板參數(shù)(其實(shí)int類型也可以)
  • 模板特化
  • 變長參數(shù)模板
  • 模板函數(shù)的完美轉(zhuǎn)發(fā)
#include "ModernCppTestHeader.h"
namespace n_template{
	template <class T>
	void template_func(T t)
	{
		LOG_VAR(t);
	}
	template <class T>
	class Number
	{
	public:
		T v;
		Number(T v) : v(v)
		{
			LOG_VAR(v);
		}
	};
	template <class T>
	constexpr T pi = T(3.1415926f);
	template <int INTVAL>
	void log_template_int_value()
	{
		LOG_VAR(INTVAL);
	}
	enum class EAnim : int {
		Other = 0,
		Cat = 1,
		Dog = 2,
	};
	template<EAnim Ty>
	class Anim
	{
	public:
		void Bark() { LOG("默認(rèn):動(dòng)物叫"); }
	};
	template<>
	class Anim<EAnim::Dog>
	{
	public:
		void Bark() { LOG("狗:汪汪!"); }
	};
	template<>
	class Anim<EAnim::Cat>
	{
	public:
		void Bark() { LOG("貓:喵喵!"); }
	};
	// 注意遞歸基
	void log_values()
	{
		LOG("展開結(jié)束");
	}
	template<class T, class... ARGS>
	void log_values(T value, ARGS... args)
	{
		LOG(value);
		log_values(args...);
	}
	template<class T>
	void func_plus(T&& a)
	{
		auto v = a;
		LOG("func_plus v = " << a);
	}
	template<class T, class... ARGS>
	void func_plus(T&& a, T&& b, ARGS... args)
	{
		func_plus(a + b, std::forward<ARGS>(args)...);
	}
	template<class T>
	void func_mul(T&& a)
	{
		auto v = a;
		LOG("func_mul v = " << a);
	}
	template<class T, class... ARGS>
	void func_mul(T&& a, T&& b, ARGS... args)
	{
		func_mul(a + b, std::forward<ARGS>(args)...);
	}
	template <class... ARGS>
	void call_func(const std::string& name, ARGS&&... args)
	{
		if (name == "plus")
			func_plus(std::forward<ARGS>(args)...);
		else if (name == "mul")
			func_mul(std::forward<ARGS>(args)...);
		else
			LOG("Unknown function name: " << name);
	}
}
template<typename T>
using Num = n_template::Number<T>;
void template_test()
{
	LOG_FUNC();
	LOG_TAG(" 函數(shù)模板 ");
	{
		n_template::template_func(1);
		n_template::template_func(1.25f);
		LOG("Lambda 函數(shù)模板");
		auto f = []<class T> (T t) { LOG_VAR(t); };
		f(1);
		f(1.25f);
	}
	LOG_TAG("類模板");
	{
		n_template::Number(1);
		n_template::Number(1.25f);
	}
	LOG_TAG("別名模板");
	{
		Num<int>(1);
		Num<float>(1.25f);
	}
	LOG_TAG("變量模板");
	{
		auto v1 = n_template::pi<int>;
		auto v2 = n_template::pi<float>;
		LOG_VAR(v1);
		LOG_VAR(v2);
		n_template::log_template_int_value<10>();
		n_template::log_template_int_value<20>();
	}
	LOG_TAG("枚舉變量模板&模板特化");
	{
		n_template::Anim<n_template::EAnim::Dog>().Bark();
		n_template::Anim<n_template::EAnim::Cat>().Bark();
		LOG("EAnim::Other 沒有特化使用默認(rèn)模板");
		n_template::Anim<n_template::EAnim::Other>().Bark();
	}
	LOG_TAG("變長參數(shù)模板");
	{
		n_template::log_values("jack", 10, 3.14f);
	}
	LOG_TAG("變長參數(shù)模板的完美轉(zhuǎn)發(fā)");
	{
		n_template::call_func("plus", 1, 2, 3, 4);
		n_template::call_func("mul", 2, 3);
	}
}

到此這篇關(guān)于C++基本用法實(shí)踐之模板詳解的文章就介紹到這了,更多相關(guān)C++模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)

    C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)

    這篇文章主要介紹了C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Qt菜單QMenu和菜單欄QMenuBar及自定義菜單用法

    Qt菜單QMenu和菜單欄QMenuBar及自定義菜單用法

    本文主要介紹了Qt菜單QMenu和菜單欄QMenuBar及自定義菜單用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • MFC繪制不規(guī)則窗體的方法

    MFC繪制不規(guī)則窗體的方法

    這篇文章主要介紹了MFC繪制不規(guī)則窗體的方法,涉及MFC窗體操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C?語言的弱符號(hào)與弱引用你了解嗎

    C?語言的弱符號(hào)與弱引用你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C?語言弱符號(hào)與弱引用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++中ctemplate的使用

    C++中ctemplate的使用

    CTemplate是一種簡單但功能強(qiáng)大的模板引擎,廣泛用于各種HTML模板解析和生成,本文主要介紹了C++中ctemplate的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C/C++實(shí)現(xiàn)目錄監(jiān)視器的方法詳解

    C/C++實(shí)現(xiàn)目錄監(jiān)視器的方法詳解

    這篇文章主要介紹了C/C++ 實(shí)現(xiàn)目錄監(jiān)視器的方法,然后網(wǎng)上查到的基本就有三種方法,使用FindFirstChangeNotification等系列函數(shù),使用ReadDirectoryChangesW函數(shù)和使用change journals,本文使用了第二種方式來實(shí)現(xiàn)一個(gè)目錄監(jiān)視,需要的朋友可以參考下
    2024-04-04
  • C++中虛繼承時(shí)的構(gòu)造函數(shù)示例詳解

    C++中虛繼承時(shí)的構(gòu)造函數(shù)示例詳解

    在虛繼承中,虛基類是由最終的派生類初始化的,換句話說,最終派生類的構(gòu)造函數(shù)必須要調(diào)用虛基類的構(gòu)造函數(shù),這跟普通繼承不同,在普通繼承中,派生類構(gòu)造函數(shù)中只能調(diào)用直接基類的構(gòu)造函數(shù),不能調(diào)用間接基類的,所以本文將通過代碼示例給大家介紹一下C++虛繼承構(gòu)造函數(shù)
    2023-09-09
  • Qt?timerEvent實(shí)現(xiàn)簡單秒表功能

    Qt?timerEvent實(shí)現(xiàn)簡單秒表功能

    這篇文章主要為大家詳細(xì)介紹了Qt?timerEvent實(shí)現(xiàn)簡單秒表功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問題

    C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問題

    這篇文章主要介紹了std::queue中遇到釋放內(nèi)存錯(cuò)誤的問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • OpenCV和C++實(shí)現(xiàn)圖像的翻轉(zhuǎn)(鏡像)、平移、旋轉(zhuǎn)、仿射與透視變換

    OpenCV和C++實(shí)現(xiàn)圖像的翻轉(zhuǎn)(鏡像)、平移、旋轉(zhuǎn)、仿射與透視變換

    這篇文章主要給大家介紹了關(guān)于OpenCV和C++實(shí)現(xiàn)圖像的翻轉(zhuǎn)(鏡像)、平移、旋轉(zhuǎn)、仿射與透視變換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09

最新評(píng)論

平阴县| 乌兰浩特市| 石首市| 清涧县| 济源市| 乌兰察布市| 株洲县| 西安市| 五家渠市| 东光县| 错那县| 孟津县| 称多县| 达州市| 宁阳县| 元氏县| 紫云| 綦江县| 乳山市| 和田市| 汕尾市| 进贤县| 西和县| 太保市| 前郭尔| 安吉县| 华宁县| 永清县| 丽水市| 昭平县| 玉环县| 鱼台县| 海安县| 禹州市| 汨罗市| 乌拉特后旗| 莲花县| 邹平县| 平顶山市| 丹巴县| 眉山市|