• c++模板入门


    最近使用了c++模板,觉得非常强大,只是写起来需要掌握一点技巧。大部分模板都是直接把定义写在.h头文件,并且有些人还说这样做的原因是模板不支持分编译,可是以前的编译器对模板的支持不够好吧,但是现在完全可以。

    环境:

    win7 32旗舰版、VS2010 sp1

    1、普通函数模板

    define.h文件

    template<typename T>
    T GetString(int value);
    define.cpp文件
    #include "define.h"
    
    template<typename T>
    T GetString<T>(int value)
    {
    	return T(value);
    }
    
    //偏特化
    template<>
    string GetString<string>(int value)
    {
    	char psz[32] = {0};
    	itoa(value, psz, 10);
    	return string(psz);
    }
    
    //偏特化
    template<>
    wstring GetString<wstring>(int value)
    {
    	wchar_t psz[32] = {0};
    	_itow(value, psz, 10);
    	return wstring(psz);
    }
    
    /*
    如果我们直接包含define.h后,使用GetString<int>(100)函数调用,是使用不了的,会产生链接错误,为什么呢?我们上面定了函数模板的通用
    实现,但是并没有实例化为一个真正的函数,既然不是函数,编译器当然不会生成代码,所以会出现链接错误;要解决这个问题的最主要就是实例化函
    数模板使之成为一个真正的函数,第一种办法是:使用上面偏特化的方法,例如string和wstring类型的偏特化,因为上面已经写了,所以不多说了;
    下面说第二种办法
    */
    #define TEMPLATE_GET_STRING(T) template T GetString<T>(int value);
    TEMPLATE_GET_STRING(int)//函数模板实例化
    // 如果要在dll中导出此函数,我们可以这样
    template __declspec(dllexport) int GetString<int>(int value);
    

    2、类模板

    define.h文件

    template<typename T>
    class A
    {
    public:
    	A()
    	{
    		InitValue();
    	}
    
    	void InitValue();
    
    	int m_nValue;
    };

    define.cpp文件 

    template<typename T>
    A<T>::A()
    {
    	InitValue();
    }
    
    template<>
    void A<string>::InitValue()
    {
    	m_nValue = 100;
    }
    
    template<>
    void A<int>::InitValue()
    {
    	m_nValue = 200;
    }
    
    // 类模板实例化
    template
    A<int>;
    

    3、成员函数模板

    define.h文件

    class B
    {
    public:
    	template<typename T>
    	T Get(int index);
    };

    define.cpp文件

    //成员函数模板偏特化
    template<>
    double B::Get<double>(int index)
    {
    	return 2.1;
    }
    
    //成员函数模板偏特化
    template<>
    int B::Get<int><int>(int index)
    {
    	return 1;
    }
    </int>

    //如果类B是一个数据库封装类,我们就可以利用这样的调用方式来获取数据库一条记录中的字段

    B b;
    b.Get<int>(1);//获取当前记录中第一个字段的值,并转化为int类型
    b.Get<double>(2)//获取当前记录中第二个字段的值,并转化为double类型

    这样是不是非常方便^^。

  • 相关阅读:
    VScode+phpStudy搭建php代码调试环境
    bluekeep漏洞(CVE-2019-0708)利用
    bugku论剑场web解题记录
    upload-labs通关集
    攻防世界web新手区
    Vulnhub-XXE靶机学习
    Volatility取证使用笔记
    攻防世界WEB新手练习
    攻防世界MISC新手练习
    攻防世界CRYPTO新手练习
  • 原文地址:https://www.cnblogs.com/dongc/p/5225119.html
Copyright © 2020-2023  润新知