在动态库和静态库中使用模板(dynamic libraries ,static libraries)

 更新时间:2020年4月25日 17:29  点击:1382

动态导入库和静态库: 他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等 ,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息

问题分析: 模板函数和模板类在库中使用的时候 非常困难,但也不是不可能,因为只有相应参数类型的模板函数在库内部有实例,就能成功导出这个模板函数。对于模板类的公有成员函数们(包括构造/析构函数)全部都必须有实例存在。

为什么要将模板实例化: 只有将导出库里面的模板函数或者模板类实例化,才能将实例化后模板函数的地址信息和模板类实例化的地址信息保存在导出库中。

示范:我还是以一个例子来说明吧,这是个动态库(dynamic libraries)的例子。

//<span style="font-family:'Microsoft YaHei';">TemplateLib.h</span><span style="font-family:'Microsoft YaHei';">使用动态库</span>
#ifdefTEST_DLL_EXPORTS
#define TEST_API__declspec(dllexport)
#else
#define TEST_API__declspec(dllimport)
#endif
// 导出模板函数
template<typename T1>
TEST_APIvoidfun1(T1);

template<typename T1,typename T2>
TEST_APIvoidfun2(T1 , T2);
// 模板类
template<typename T,int size>
class TEST_APICTest
{
public:
CTest() {};
~CTest(){};
T*GetDataBuff() { return m_data;}
private:
T m_data[size];
};

// TemplateLib.cpp : 定义 DLL 应用程序的导出函数。
#include "stdafx.h"
#include "TemplateLib.h"
// 1.利用重载来实例化不同类型的模板,代码量大不说,基本上是重复的代码
// 2.库的设计者不知道用户会传入什么类型,也就是说设计者不可能实例化每一种类型的模板。
TEST_APIvoid fun1(int var1) {}
TEST_APIvoid fun1(char var1){}
template<typename T1,typename T2>
TEST_APIvoid fun2( T1 var1, T2 var2){}
// 这个名字空间不作为导出使用,唯一作用是用来例化函数模板和类模板.
namespace implement_template_private
{
voidimplement_template()
{
int idata = 10;
charchr = 'x';
float fdata = 20.f;
UINTundata= 9;
char* str = "hello";
// 这种方式的实例化,代码量比重载方式少许多,但需运行一次该模板函数
// 也许在某些时候凭空运行这个函数是不合理的。
fun2(idata,chr);// int,char
fun2(undata,str); // UINT,char*
fun2<float,char*>(fdata,str); // float,char* 显示参数
// 导出类的实例化。
// 1.除了要实例化提供给用户使用的公有成员函数外,这里面还隐含的实例化了构造函数和析构函数.
// 2.注意这里每一个模板的实例化都是唯一的。
// 3.假如客户如果在项目中使用了CTest<char,30> impl_obj; 将会连接错误, 模板的参数列表必须完全匹配。
// 4.假如该模板类非常大,功能非常多,那么实例化工作可以想象是不堪忍受的。
// 5.库的设计者不知道用户会传入什么类型,也就是说设计者不可能实例化每一种类型的模板。
CTest<char,20>impl_obj;
impl_obj.GetDataBuff();
CTest<int,5>impl_obj2;
impl_obj.GetDataBuff();
}
};
//

在另外一个项目中使用我们刚刚创建的动态库

// TemplateExport.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "..\TemplateLib\TemplateLib.h"
#pragma comment(lib,"TemplateLib.lib")

int _tmain(int argc, _TCHAR* argv[])
{
fun1<int>(10);
fun1<char>('x');
//fun1<float>(20.f);// 连接错误
fun2<float,char*>(20,"hello");
//fun2<int,int>(20,30); // 连接错误
CTest<char,20> test;
char* ret = test.GetDataBuff();
//CTest<char,30> test2; // 连接错误
return 0;
}

总结与建议:不建议在导出库中使用模板相关的技术,假如你能够确定用户在使用你设计的模板函数时,将传入哪些类型(type),设计者要将这些类型的模板一 一实例化。

以上就是在动态库和静态库中使用模板解决方法的全部内容和代码,希望我们的整理能够帮助到你。

[!--infotagslink--]

相关文章

  • 深入解析WordPress中加载模板的get_template_part函数

    这篇文章主要介绍了WordPress中加载模板的get_template_part函数,其中重点讲解了其函数钩子的使用,需要的朋友可以参考下...2016-01-14
  • mysql配置模板(my-*.cnf)参数详细说明

    mysql安装成功后有几个默认的配置模板,列表如下: my-huge.cnf : 用于高端产品服务器,包括1到2GB RAM,主要运行mysql my-innodb-heavy-4G.ini : 用于只有innodb的安装,最多有4GB RAM,支持大的查询和低流量 my-large.cnf : 用于...2015-03-15
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • Ionic默认的Tabs模板使用实例

    这篇文章主要为大家详细介绍了Ionic默认的Tabs模板使用实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-09-01
  • Springboot使用thymeleaf动态模板实现刷新

    这篇文章主要介绍了Springboot使用thymeleaf动态模板实现刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-31
  • WordPress中获取所使用的模板的页面ID的简单方法

    这篇文章主要介绍了WordPress中获取所使用的模板的页面ID的简单方法,通过这个方法来获取页面的链接是比较方便的,需要的朋友可以参考下...2016-01-04
  • IDEA2020.3.2版本自动注释类和方法注释模板配置步骤详解

    这篇文章主要介绍了IDEA2020.3.2版本自动注释类和方法注释模板配置步骤,本文给大家分享了我自己创建过程通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-31
  • java使用Abobe Acrobat DC生成模板

    这篇文章主要介绍了java使用Abobe Acrobat DC生成模板,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-22
  • ASP.NET如何自定义项目模板详解

    这篇文章主要给大家介绍了关于ASP.NET如何自定义项目模板的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ASP.NET具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-09-22
  • Go语言多值替换的HTML模板实例分析

    这篇文章主要介绍了Go语言多值替换的HTML模板,实例分析了Go语言多值替换与数组迭代的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-05
  • 帝国CMS7.0搜索模板也支持动态标签

    帝国CMS7.0默认搜索模板不支持动态标签。通过以下方法可以实现搜索模板支持动态标签。修改 e/search/result/index.php 为以下代码:<?php require('../../class/connect.php'...2015-12-30
  • Go语言非main包编译为静态库并使用的示例代码

    本文以Windows为例,介绍一下如何将Go的非main包编译为静态库,用户又将如何使用。通过实际项目创建常规工程,通过示例代码给大家介绍的非常详细,需要的朋友参考下吧...2021-07-11
  • php安装curl模板方法详解

    curl 是使用URL语法的传送文件工具,支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL证书、HTTP POST、HTTP PUT 、FTP 上传,kerberos、...2016-11-25
  • php模板简单写法

    这是一个简单的用php 实现的模板教程物。 class TEMPLATE { private $path = "." ;...2016-11-25
  • C语言数组栈实现模板

    这篇文章主要为大家详细介绍了C语言数组栈实现模板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • Spring Boot thymeleaf模板引擎的使用详解

    这篇文章主要介绍了Spring Boot thymeleaf模板引擎的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-08
  • C++模板二段名字查找方法

    下面小编就为大家带来一篇C++模板二段名字查找方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • C++ 标准模板类详解

    今天小编就为大家分享一篇关于C++标准模板类的介绍与使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2021-09-14
  • C#模板方法模式(Template Method Pattern)实例教程

    这篇文章主要介绍了C#模板方法模式(Template Method Pattern),以实例形式讲述了C#抽象类模板方法的用法,具有很高的实用价值,需要的朋友可以参考下...2020-06-25
  • 如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单

    这篇文章主要介绍了如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-25